hdu 1024 动态规划

刷kuangbin的基础dp1

n个数分m个不交的段,问最大值是多少?

首先如果是dp[i][j]表示j个数分i段且a[j]一定会被用到!这点相当重要,因为如果a[j]用不到,就有可能在转移的时候接不上。

另外 不要照着一维死看,二维看懂了,自己手动改成一维的。

dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][t]+a[j]);i-1<=t<=j-1;蛮经典的题目。前面表示接上,后面表示a[j]另起炉灶,但是注意,j-1的时候是:强行把自己a[j]分成了一段。无语......

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <time.h>

using namespace std;

#define MAXN 1000000
#define INF 0x7fffffff
int dp[MAXN+10];
int mm[MAXN+10];
int a[MAXN+10];
int maxn;
int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int n,m;
    while (scanf ("%d%d",&m,&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        memset(mm,0,sizeof(mm));
        memset(a,0,sizeof(a));
        for (int i=1;i<=n;i++)
        {
             scanf ("%d",&a[i]);
        }
        for (int i=1;i<=m;i++)
        {
            maxn=-INF;
            for (int j=i;j<=n;j++)
            {
                dp[j]=max(dp[j-1]+a[j],mm[j-1]+a[j]);
                mm[j-1]=maxn;
                printf("dp[%d]=%d mm[%d]=%d\n",j,dp[j],j-1,mm[j-1]);
                maxn=max(maxn,dp[j]);
            }
            printf ("分%d块结束\n",i);
        }
        printf ("%d\n",maxn);
    }
    return 0;
}

posted on 2016-04-08 22:34  very_czy  阅读(151)  评论(0编辑  收藏  举报

导航