m 段 最大和 max sum plus plus

来源:互联网 发布:数据库质量控制 编辑:程序博客网 时间:2024/06/05 21:02
#include <stdio.h>#include <string.h>#include <string>#include <stdlib.h>#include <iostream>#include <algorithm>#include <sstream>#include <ostream>#include <ctype.h>#include <stack>#include <queue>#include <cmath>using namespace std;int arr[1000006];int dp[1000006];int maxx[1000006];int main(){    int n,m;    while(scanf("%d %d",&m,&n)!=EOF)    {        memset(maxx,0,sizeof(maxx));        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++) scanf("%d",&arr[i]);        int maxxx;        for(int i=1;i<=m;i++)        {                                      //maxx==0 表示没有选哦            maxxx=-2000000000;            for(int j=i;j<=n;j++)            {                dp[j]=max(dp[j-1]+arr[j],maxx[j-1]+arr[j]);//当j==i时很精巧 滚动数组也有好处                maxx[j-1]=maxxx;                maxxx=max(maxx[j-1],dp[j]);            }        }        int mm=-2000000000;        for(int i=m;i<=n;i++) mm=max(mm,dp[i]);        cout<<mm<<endl;    }    return 0;}
这个地方要注意状态转移的过程 再每次开始的时候必须由上一次开始转移 这个地方不能再选前面不转移。
0 0