HDU - 1176 免费馅饼(DP)
2015-09-26 10:21
295 查看
题目大意:有一个游戏,刚开始参赛者站在5这个位置,参赛者每秒可以移动一个1个单位距离,参赛者可以得到 当前位置 - 1, 当前位置,当前位置 + 1的任意一个位置的馅饼
现在给出馅饼掉落的位置和时间,问参赛者最多可以获得多少馅饼
解题思路:倒着推,用dp[j][i]表示第i秒在j这个位置所能得到的最大馅饼数,接着可得转移方程
dp[j][i] = max(dp[j - 1][i + 1], dp[j][i +1], dp[j + 1][i + 1])
j == 0和j == 10是要特殊处理
现在给出馅饼掉落的位置和时间,问参赛者最多可以获得多少馅饼
解题思路:倒着推,用dp[j][i]表示第i秒在j这个位置所能得到的最大馅饼数,接着可得转移方程
dp[j][i] = max(dp[j - 1][i + 1], dp[j][i +1], dp[j + 1][i + 1])
j == 0和j == 10是要特殊处理
[code]#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int dp[11] ; int n; void solve() { int Max = -1; memset(dp, 0, sizeof(dp)); int x, t; for (int i = 0; i < n; i++) { scanf("%d%d", &x, &t); dp[x][t]++; Max = max(Max, t); } for (int i = Max - 1; i >= 0; i--) { for (int j = 0; j <= 10; j++) { if (j == 0) dp[j][i] += max(dp[j][i + 1], dp[j + 1][i + 1]); else if (j == 10) dp[j][i] += max(dp[j][i + 1], dp[j - 1][i + 1]); else dp[j][i] += max(dp[j][i + 1], max(dp[j - 1][i + 1], dp[j + 1][i + 1])); } } printf("%d\n", dp[5][0]); } int main() { while (scanf("%d", &n) != EOF && n) solve(); return 0; }
相关文章推荐
- javascript闪烁图片
- pe创建激活administrator后消除问题,删除用户问题
- PAT(甲级)1050
- JAVA --解压缩
- 新世界PT850/PT853检查用友机对接T1交易宝
- PAT(甲级)1049
- leetcode 080 Remove Duplicates from Sorted Array II(难易度:Medium)
- Bios工程师手边事—battery
- 自定义的RPC的Java实现
- JAVA-文件压缩
- 大道至简读后感
- MVC学习笔记---各种上下文context
- WPF 中图标路径问题
- jqery实现10X10的表格,双击消失
- WPF 中图标路径问题
- PAT(甲级)1048
- C语言复习day2
- uvalive 4671 - K-neighbor substrings 快速傅利叶变换
- PAT(甲级)1047
- 快速开发一个PHP扩展