hdu 1024 max sum plus plus

来源:互联网 发布:wan端口和lan端口 编辑:程序博客网 时间:2024/06/06 12:30
#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;#define INF 0x3f3f3f3fint a[1010000];//存储输入的数据int dp[1010000];//记录前j个数不相交子段的最大值int mmax[1010000];int main(){int m,n;int i,j;int mmmax;while(scanf("%d%d",&m,&n)!=EOF){for(i=1;i<=n;i++){scanf("%d",&a[i]);dp[i]=0;mmax[i]=0;}dp[0]=0;mmax[0]=0;for(i=1;i<=m;i++){mmmax=-INF;/*这一步不能少分析:           从下面的程序来看,当i=1运行完的时候,mmmax是一个在   1。。。n中取一段时的最大值    接下来就是i=2了,此时要取二段了,那么如果你不执行这一步的   话,那么i=2的时候mmax[1]=-INF(这个是没影响的),对mmmax=max(mmmax,dp[j])    这一步就产生了影响 ,因为如果mmmax>dp[j]那么结果就会变了,紧接着就会对i=3   的时候mmax[2]=mmmax这一步产生影响,接下去就是连环影响了            */ for(j=i;j<=n;j++){dp[j]=max(dp[j-1]+a[j],mmax[j-1]+a[j]);/*是对这一步的转化            status[i][j]=max(status[i-1][j]+a[j],max(status[0][j-1],,,,status[i-1][j-1])+a[j]); */ mmax[j-1]=mmmax;mmmax=max(mmmax,dp[j]);/*只要你把题目的数据 2 6 -1 4 -2 3 -2 3代进去模拟一下,你就会加深理解了, 另外多看看别人的博客上的思路,我这里写的比较简单,不过重在自己模拟一下 会更好理解的  */ }}printf("%d\n",mmmax);}return 0;}

0 0