hdu 1176 免费馅饼 (数塔dp)
2015-08-13 20:51
309 查看
原题链接:
http://www.cnblogs.com/DiaoCow/archive/2010/04/18/1714859.html
比较好理解。
5 (起始位置)
4 | 5 | 6
3 4 5 | 4 5 6 | 5 6 7
自底向上计算,保证数据最优。
状态转移方程
dp[ i ][ j ]=dp[ i+1 ][ j-1 ]+dp[ i+1 ][ j ]+dp[ i+1 ][ j+1];
代码如下:
http://www.cnblogs.com/DiaoCow/archive/2010/04/18/1714859.html
比较好理解。
5 (起始位置)
4 | 5 | 6
3 4 5 | 4 5 6 | 5 6 7
自底向上计算,保证数据最优。
状态转移方程
dp[ i ][ j ]=dp[ i+1 ][ j-1 ]+dp[ i+1 ][ j ]+dp[ i+1 ][ j+1];
代码如下:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; const int N=100000 + 10; int dp [11]; int main() { int n; while (cin >> n&&n) { memset(dp, 0, sizeof(dp)); int x, time, maxtime = 0; for (int i = 0; i < n; i++) { scanf_s("%d%d", &x, &time); dp[time][x]++; if (time>maxtime) maxtime = time; //记下最大时间 } for (int i = maxtime - 1; i >= 0; i--) { dp[i][0] += max(dp[i + 1][0], dp[i + 1][1]); dp[i][10] += max(dp[i + 1][9], dp[i + 1][10]); for (int j = 1; j < 10; j++) dp[i][j] += max(dp[i + 1][j - 1], max(dp[i + 1][j], dp[i + 1][j + 1]));//选择下面三个中最大的一个 } printf("%d\n", dp[0][5]); } return 0; }
相关文章推荐
- Android安全小记(二)
- 结合实例说说线程封闭和背后的设计思想
- [图论]连接岛屿问题(MST.Kruskal算法 并查集)
- (札记)Java应用架构设计-模块化模式与OSGi
- ZOJ 1203 Swordfish【最小生成树】
- Ubuntu下安装Eclipse
- Nginx基本数据结构之ngx_array_t
- 计算机程序的构造和解释笔录(1):构造过程抽象
- 【Android 】HttpURLConnection里byte转化string的错误笔记
- 我爱机器学习网深度学习类别文章汇总
- HDU 5387(2015多校8)-Clock(模拟)
- 1020. Tree Traversals (25) - 已知后序和中序求二叉树
- HDU 5385 The path
- 【大数据工程师之路】Hadoop——MapReduce概述
- 作为程序员之 Vim(一)
- 在linux内核中实现自己的系统调用
- 插件的“动态替换”
- ListView 添加footView导致崩溃的问题
- Android使用ImageLoader异步加载网络图片(一)读取单张图片
- find the nth digit