导航

HDU 1024 【DP】

Posted on 2015-11-02 15:55  tun~  阅读(123)  评论(0编辑  收藏  举报

题意:

给n个数将其分成连续的m组,使得这些组的数加和最大,组与组之间可以空数。

/*
dp[i][j]表示将前j个数分成i个组最大值
状态转移方程是:
dp[i][j]=max(dp[i-1][0...j-1],dp[i][j-1])+tmp[j];
内存的优化是用滚动数组记录dp[i][...]和dp[i-1][...]
时间的优化是将dp[i-1][...]用dp[i-1][j]=max(dp[i-1][1...j])代替省去一维时间
并不清楚这道题的复杂度怎么算...
坑点:
1.第一次写滚动数组,边界没有设置好。
2.没有有效区分出有意义的状态。
*/
#include<stdio.h>
#include<string.h>
inline int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
const int inf=0x7fffffff;
int tmp[1000006];
int bf[1000006];
int bbf[1000006];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(bf,0,sizeof(bf));
        memset(bbf,0,sizeof(bbf));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&tmp[i]);
        }
        for(int i=1;i<=m;i++)
        {
            bf[i-1]=-inf;
            for(int j=i;j<=n;j++)
            {
                bf[j]=max(bbf[j-1],bf[j-1])+tmp[j];
            }
            bbf[i-1]=-inf;
            for(int j=i;j<=n;j++)
            {
                bbf[j]=max(bbf[j-1],bf[j]);
            }
        }
        printf("%d\n",bbf[n]);
    }
}