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