hdu 1176:免费馅饼
2012-07-25 13:33
375 查看
hdu1176: http://poj.org/problem?id=1179 题意:有一一维坐标系,从0编号到10,一个人站在5上,现在天上正在掉馅饼,这个人每秒只能移动一个单位,所以第一秒只能接住掉在4、5、6上的馅饼,现给出某个点在某个时间 点有馅饼,问最多能接到多少馅饼 解法:dp:dp[i][j]表示直到第j秒站在i上接到的最多馅饼数,则有转移方程:dp[i][j]=v[i][j]+max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])。 code:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; const int inf = 1 << 29; #define MAX 100050 int dp[13][MAX],v[13][MAX], n; int max(int a,int b) { if(a>b) return a; else return b; } int main() { while(1) { scanf("%d",&n); if(n==0)break; int T = 0, x, t; memset(dp, 0, sizeof(dp)); memset(v,0,sizeof(v)); for(int i = 0; i < 13; i++) { dp[i][0] = -inf; //也可不用v,直接用dp代替 v[i][0]=-inf; } dp[6][0] = 0; //初始状态为0 for(int i = 0; i < n; i++) { scanf("%d%d", &x, &t); v[x+1][t]++; //此处用到一点技巧,将坐标系往右移一位,则后面的j-1不会出现为负数 T = max(T, t); } for(int i = 1; i <= T; i++) for(int j = 1; j <= 11; j++) dp[j][i]=v[j][i]+max(dp[j-1][i-1], max(dp[j][i-1], dp[j+1][i-1])); int ans = 0; for(int i = 1; i <= 11; i++) ans = max(ans, dp[i][T]); //取最大值 printf("%d\n",ans); } return 0; } /*input: 6 5 1 4 1 6 1 7 2 7 2 8 3 0 output: 4*/
相关文章推荐
- hdu 1176 免费馅饼
- HDU 1176 免费馅饼 dp
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼 dp
- HDU-1176-数塔DP-免费馅饼
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼
- HDU 1176 免费馅饼 (DP)
- HDU-1176 免费馅饼
- hdu 1176 免费馅饼(nyist 613)
- hdu 1176 免费馅饼
- [简单DP]免费馅饼 HDU - 1176
- G - 免费馅饼 HDU - 1176
- HDU 1176 免费馅饼
- HDU-OJ 杭电 1176 免费馅饼
- hdu 1176 免费馅饼
- hdu1176 免费馅饼 两种动态规划 三段程序(分别为TLE,AC,AC)
- HDU1176 免费馅饼 -- 动态规划
- HDU 1176 免费馅饼(DP)
- hdu 1176 免费馅饼(DP)