hdu 免费馅饼
来源:互联网 发布:南方数据传输软件下载 编辑:程序博客网 时间:2024/06/01 10:49
题目,点击打开
我认为可以用两个数组储存,a与f设a[i][j]为第i秒的j位置掉下的馅饼数量,
f[i][j]为第i秒在j位置接馅饼最多可以接到的最多馅饼数量。
然后就是关于移动。因为gameboy一秒移动一个单位,故一秒可到位置是
f[i-1][j-1]
f[i-1][j]
f[i-1][j+1]
自己复习了dp后,自己也学会了一点,发现每一个算法都有状态转移方程,
这题应该是一个背包,所以,在思索了30多分钟(可怜的孩子)后,终于
想出来了此题的状态转移方程:
f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+a[i][j];
但是,还有一种简单的方法,数塔问题都听过吧,这题算是dp与递推的入门题,采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排数其中一个,向上退,倒数第二步肯定走最后一排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中)再向上推,一直推到最上面的第0步,那么dp[0][0]最后所存的结果一定是最大的。
那这题也是一样的,把秒数当行,距离当列,先储存,在数塔,解决。
标码
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 100005; int a[maxn][12]; int f[maxn][12]; int maxT; int dp(){ int i; int j; int maxSum = -9; f[1][4] = a[1][4]; f[1][5] = a[1][5]; f[1][6] = a[1][6]; for(i = 2 ; i <= maxT ; ++i){ for(j = 0 ; j < 11 ; ++j){ f[i][j] = f[i-1][j]; if(j > 0){ f[i][j] = max(f[i][j],f[i-1][j-1]); } if(j < 10){ f[i][j] = max(f[i][j],f[i-1][j+1]); } f[i][j] += a[i][j]; } } for(i = 1 ; i <= maxT ; ++i){ for(j = 0 ; j < 11 ; ++j){ if(maxSum < f[i][j]){ maxSum = f[i][j]; } } } return maxSum; } int main(){ int n; while(scanf("%d",&n)!=EOF,n){ memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); int i; for(i = 1 ; i <= n ; ++i){ int x,t; scanf("%d%d",&x,&t); a[t][x]++; maxT = max(maxT,t); } printf("%d\n",dp()); } return 0; }
注:不用scanf好像超时。
阅读全文
0 0
- hdu 1176 免费馅饼
- hdu 1176 免费馅饼
- hdu 1176 免费馅饼
- HDU 1176 - 免费馅饼
- hdu 1176 免费馅饼
- hdu 1176免费馅饼
- hdu 1176 免费馅饼
- hdu 1117 免费馅饼
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼
- hdu - 1176 - 免费馅饼
- HDU 1176 免费馅饼
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼
- HDU 1176 免费馅饼
- hdu 免费馅饼
- Timer和图片框控件,编写不断向左移动的小动画
- Win和Ubuntu时钟不同步
- 开源ETL-kettle
- easyui treegrid按需显示垂直滚动条问题
- Optical_Flow(4)
- hdu 免费馅饼
- 学习笔记:Java中的泛型
- 通过bind进行DNS配置
- Android 如何让悬浮窗口覆盖显示在导航栏之上?
- [noip 2016普及组第三题]: 海港
- activiti学习(一)
- DNS服务器搭建详解
- Ruby构造简单的登录请求登录WEB服务器
- 从统计学的角度看线性回归