一、动态规划思想:动态规划通过多阶段决策解决问题,每一次的决策结果序列都必须进行存储。因此,可以说:“动态规划是高效率、高消费”的算法。动态规划就是分支算法的升级版,它的实质是:分支算法+解决子问题冗余情况。
二、下面就从动态规划的角度设计算法。
1.记sum为a[1]–a[i]的最大子段和,this_sum[i]为当前字段和。
2.this_sum[i]从1开始累加:this_sum[j]=this_sum[j-1]+a[j];
当this_sum[i]>sum时,sum=this_sum[j];重置最大子段和。
当this_sum[i]<0时,这时前面的字段和就没有意义啦,因为都比0小啦,所以
this_sum[j]=0,归零,重新开始累加。
大体就是这么简单的思路,下面上代码:
#include <stdio.h>
int max_sum(int a[],int n,int *best_i,int *best_j){
int i,j,this_sum[n+1],sum;
this_sum[0]=0;
sum=0;
*best_i=0;
*best_j=0;
i=1;
for(j=1;j<=n;j++){
this_sum[j]=this_sum[j-1]+a[j]; //当前子段和;
if(this_sum[j]>sum){
sum=this_sum[j];
*best_i=i;
*best_j=j;
}
else if(this_sum[j]<0){ //到0就重新计,看看是不是比sum大
i=j+1;
this_sum[j]=0;
}
}
return sum;
}
int maxSum(int a[],int n){
int sum=0;
int b=0,i;
for(i=1;i<=n;i++){
if(b>=0)
b+=a[i];
else
b=a[i];
if(b>sum)
sum=b;
}
return sum;
}
void main(){
int a[]={-2,15,-100,13,-2,5};
int i,j,sum;
sum = max_sum(a,5,&i,&j);
//sum=maxSum(a,5);
printf("%d\n",sum);
printf("区间从%d->%d",i,j);
}