动态规划
- 动态规划求最大子序列之和以及序列号
- 题目描述
- 代码描述
- 方法一:保留过程值
- 代码效果
- 方法二:不保留过程值
动态规划求最大子序列之和以及序列号
题目描述
给定一个数组,求此数组的子序列之和的最大值以及子序列的起始序号,末端序号
例如:数组: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;
}