dp 最大字段和 问题

来源:互联网 发布:mac版c4d 编辑:程序博客网 时间:2024/05/29 17:15



最大字段和 最暴力的算法就是

int s = 0;//起始位置int e = 0;  //结束位置int max = 0;for(int i = 1; i <= n; ++i){    for(int j = i; j <= n;++j)    {        int sum = 0;        for(int k = i; k <=j; ++k)            sum += a[k];        if(sum > max)        {           s = i;           e = j;           max = sum;        }    }} 
显然 时间复杂度O(n^3)   可想而知 必然超时 ,  

因此优化操作  用一个sum 直接加  这样复杂度变成O(n^2)  但是 对于数据来说 仍会超时

for(int i = 1; i <= n; ++i)  {      int sum = 0;      for(int j = i; j <= n;++j)      {          sum += a[j];          if(sum > max)          {             start = i;             end = j;             max = sum;          }      }  }   

 这是我们用dp 思想来 dp[i]=max(dp[i],dp[i]+a[i]);  这样   复杂度就是O(n)74

77

for(int i = 1; i <= n; ++i)   {     if(b[i-1]>0)     {       b[i] = b[i-1]+a[i];     }else{       b[i] = a[i];     }     if(b[i]>max)       max = b[i];   }  
因此最大字段和就是max

但是 这样 我们却没有记录起始点和终点   我们又可以这样操作


  s=e=temp=1;     for(i=1;i<=n;i++)  {     scanf("%d",&x);       sum+=x;             if(sum>max)   {       max=sum;      s=temp;     e=i;      }     if(sum<0)     {        sum=0;      temp=i+1;     }    }  


0 0