练习三1007
2016-05-21 18:00
225 查看
题意:题意倒是很简单,但是物极必反,实现起来就不好想了,所以就参考了别人的想法,这是个数塔问题(不懂得还很多,要努力啊)就是个坐标轴。
思路:这是别人的思路
这道题用的是数塔,我们把数据存成数塔的形式:
以给的实例为例子来写一下:
0 1 2 3 4 5 6 7 8 9 10 ......这是代表坐标
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 1 1 1 0
0 0 0 ......这是说第1秒的落饼情况
2 0 0 0 0 0 0 0 2 0 0 0 ......第2秒
3 0 0 0 0 0 0 0 0 1 0 0 ......第3秒
. . . . . . . . . . . . ..........
从最后一秒向前递推,找到DP的状态转移方程
a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j-1],a[i+1][j+1]);
注意,边界点单独考虑;蓝色的要依次更新;最后红色的地方使我们要的答案,即啊a[0][5];
代码:
#include<stdio.h> int a[100001][11]; int main() { int i,j,x,y,m,k; while(scanf("%d",&m),m){ k=0; for(i=0;i<100001;i++) for(j=0;j<11;j++)a[i][j]=0; //记录馅饼掉下的位置 for(i=0;i<m;i++){ scanf("%d%d",&x,&y); a[y][x]++; //记录掉馅饼的总时间 if(y>k)k=y; } //从倒数第二秒开始往前计算 for(i=k-1;i>=0;i--) for(j=0;j<11;j++){ //用m记录当前位置下面紧挨着三个位置的最大值,并加到当前位置 m=a[i+1][j]; if(j>0&&a[i+1][j-1]>m)m=a[i+1][j-1]; if(j<10&&a[i+1][j+1]>m)m=a[i+1][j+1]; a[i][j]+=m; } //因为最初位置是5,所以所得最多的馅饼就是a[0][5] printf("%d\n",a[0][5]); } return 0; }
感想:是时候努力学习一波了。。
相关文章推荐
- 在Struts 2通过Spring实现控制反转(IoC)
- 接口和抽象类的区别
- android使用隐藏api的方法(使用被@hide的api)
- HDU 5694---BD String
- 关于android activity启动模式
- android测试有多重要!
- JAVA正则表达式 Pattern和Matcher
- HTML与 Css 基础知识
- JAVA正则表达式:Pattern类与Matcher类详解
- NYOJ The Triangle
- 深入理解java虚拟机 精华总结(面试)
- Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt' after
- 学习MongoDB 十: MongoDB聚合(Map-Reduce)(二)
- DeDeCMS二次开发教程之静态页面生成流程
- max()和数组里面的max
- cocos2dx js 关于canvas绘图模糊问题及解决办法
- 线程池
- linux redis日志文件路径的设置
- 常用的机器学习&数据挖掘知识点[转]
- library not found for -xxx