[简单DP]免费馅饼 HDU - 1176
2017-07-29 09:53
489 查看
[简单DP]免费馅饼 HDU - 1176
分析:
题目说gameboy想要吃尽可能多的饼,那就往DP想吧。。。发现影响结果的因素分别是时间和位置。因此我们使用DP[i][j]表示第i秒站在j位置时,得到的饼的最大值。题目限定开始位置在5处,并且每次只能移动一个单位。
状态转移方程:
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+data[i][j];
如果第i秒在位置j处,那么第i-1秒必然在j-1,j,j+1三处之一。另外再考虑下i==1时,和位置的边界处即可。
代码:
#include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> #define MIN -1 #define ll long long using namespace std; int dp[100005][11]; int data[100005][11]; int main() { int n; while(scanf("%d",&n)&&n) { memset(data,0,sizeof(data)); int x,t; int Max=0; for(int i=0;i<n;i++) { scanf("%d %d",&x,&t); data[t][x]++; if(t>Max) Max=t; } for(int i=1;i<11;i++) dp[1][i]=0; int MAX=max(data[1][4],max(data[1][5],data[1][6])); dp[1][4]=MAX; dp[1][5]=MAX; dp[1][6]=MAX; int re=0; for(int i=2;i<=Max;i++) for(int j=0;j<11;j++) { if(j==0) { dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+data[i][j]; } else if(j==10) { dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+data[i][j]; } else { dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+data[i][j]; } // printf("dp%d\n",dp[i][j]); if(re<dp[i][j]) re=dp[i][j]; } printf("%d\n",re); } return 0; }
相关文章推荐
- Hdu 1176 免费馅饼(简单DP)
- HDU - 1176 免费馅饼 (简单DP)
- hdu1176——免费馅饼(简单dp)
- hdu 1176 免费馅饼(简单dp)
- hdu1176 免费馅饼(简单DP)
- 简单DP 免费馅饼 HDU 1176
- HDU - 1176 免费馅饼 (简单DP)
- HDU 1176 免费馅饼(简单数塔DP)
- HDU 1176 免费馅饼(简单dp)
- 免费馅饼 HDU - 1176 (简单dp)
- HDU 1176 免费馅饼 (简单DP)
- HDU-1176 免费馅饼(dp)
- HDU 1176 免费馅饼 DP类似数塔题
- G - 免费馅饼 HDU - 1176 ——dp-金字塔
- hdu1176免费馅饼(DP)
- hdu 1176 免费馅饼(水题,dp)
- hdu 1176 免费馅饼(dp)
- hdu 1176 免费馅饼(DP)
- hdu 1176 免费馅饼(dp)
- hdu 1176 免费馅饼 (数塔dp)