动态规划求最大子段和

一、动态规划思想:动态规划通过多阶段决策解决问题,每一次的决策结果序列都必须进行存储。因此,可以说:“动态规划是高效率、高消费”的算法。动态规划就是分支算法的升级版,它的实质是:分支算法+解决子问题冗余情况。
二、下面就从动态规划的角度设计算法。
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);
}
点赞