hdu 1024 dp

来源:互联网 发布:python pyperclip 编辑:程序博客网 时间:2024/06/16 05:15

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024

题意:上一道题和这道题挺像,不过上一题比这个简单。。题意就是n个数,求m个不相交段,是m段和最大

思路:本弱菜自己都没理解透彻。就不坑人了。

<span style="font-family:Microsoft YaHei;">#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define ll long longconst int maxn = 1000010;int n,m;int nn[maxn],dp[maxn],pre[maxn];int main(){    while(~scanf("%d%d",&m,&n)){        for(int i=1;i<=n;i++)            scanf("%d",&nn[i]);        memset(dp,0,sizeof(dp));        memset(pre,0,sizeof(pre));        int mm;        for(int i=1;i<=m;i++){            mm = -999999999;//            for(int j=i;j<=n;j++){                dp[j] = max(dp[j-1]+nn[j],pre[j-1]+nn[j]);                pre[j-1] = mm;                if(dp[j]>mm)mm = dp[j];            }        }        printf("%d\n",mm);    }    return 0;}</span>

说下我自己的理解。。pre[j]中保存的是由前j个数组成i-1段时的最大和,mm保存的是由前j个数组成i段时的最大和,所以是后更新。

第二层循环中j从i开始,这样就保证了类似前3个数中6段和这样不合理的情况。。


0 0
原创粉丝点击