
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
今天做了一道有趣的dp题。。。题目不难。。但是居然坑了我。。
题解:dp[i][j]代表在第j秒时在第i个位置最多可以得到多少个馅饼。。
f[i][j] 代表第j秒时在第i个位置有多少个馅饼掉下。。
dp[i][j] = max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])+f[i][j];
本来状态方程式没错的。但是忽略了一种情况。。比如dp[0][1]这是不可能存在的。。因为第一秒时是不可能到达
0这个点的。。坑!
所以还要判断一下这个状态是不是可以到达的。。
最后 代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
int dp[11][100002];
int f[11][100002];
int main() {
int n,i,j;
int l,r;
while(scanf("%d",&n) && n!=0) {
memset(f,0,sizeof(f));
int Max = 0;
for(i=0;i<n;i++) {
scanf("%d%d",&l,&r);
f[l][r]++;
Max = Max<r?r:Max;
}
memset(dp,0,sizeof(dp));
int sum = 0;
//dp[5][0] = 1;
for(i=1;i<=Max;i++) {
for(j=0;j<11;j++) {
sum = dp[j][i-1];
if(abs(j-5)<=i && j>0) sum = max(dp[j-1][i-1],sum);
if(abs(j-5)<=i && j<10) sum = max(dp[j+1][i-1],sum);
if(abs(j-5)<=i)sum+=f[j][i];
dp[j][i] = max(sum,dp[j][i]);
}
}
sum = 0;
for(i=0;i<11;i++) {
sum = max(dp[i][Max],sum);
}
printf("%d\n",sum);
}
return 0;
}
hdu1176免费馅饼(dp),布布扣,bubuko.com
原文:http://blog.csdn.net/min_lala/article/details/24555319