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;
}