0
点赞
收藏
分享

微信扫一扫

【动态规划求最大子序列之和以及序列号】


动态规划

  • ​​动态规划求最大子序列之和以及序列号​​
  • ​​题目描述​​
  • ​​代码描述​​
  • ​​方法一:保留过程值​​
  • ​​代码效果​​
  • ​​方法二:不保留过程值​​

动态规划求最大子序列之和以及序列号

题目描述

给定一个数组,求此数组的子序列之和的最大值以及子序列的起始序号,末端序号
例如:数组:nums[9] = {-2,1,-3,4,-1,2,1,-5,4}
解释:最大值是:6,子序列号:{3,6}

代码描述

方法一:保留过程值

#include <stdio.h>
#include <stdlib.h>

int main() {
int dp[9][9] ={0};//从第I位到第j位的最大连续子序列和

int nums[9] = {-2,1,-3,4,-1,2,1,-5,4};

int i ,j,max = nums[0];
dp[0][0]=nums[0];
for(i=0;i<9;i++){
for(j=i;j<9;j++){
if(j>=1){
dp[i][j] = dp[i][j-1] + nums[j];
max = max > dp[i][j]?max:dp[i][j];
}
printf("%d=>%d is max=%d\n",i,j,dp[i][j]);
}
}

for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d ",dp[i][j]);
}
printf("\n");
}
printf("最大值是:%d",max);
return 0;
}

代码效果

【动态规划求最大子序列之和以及序列号】_数组

方法二:不保留过程值

#include<stdio.h>
int main(){
int nums[5] = {5,4,-1,7,8};
int numsSize = 5;
int size[2] = {0};
int maxnum = nums[0], i, a = 0;
for(i = 0; i<numsSize; i++){
// a = (a + nums[i])>nums[i]?(a + nums[i]):nums[i];
if((a + nums[i])>nums[i])
a = (a + nums[i]);
else{
a = nums[i];
size[0] = i;
}
if(a>maxnum){
maxnum = a;
size[1] = i;
}
}
printf("%d\n", maxnum);

printf("%d,%d", size[0], size[1]);
return 0;
}


举报

相关推荐

0 条评论