HDU1176 免费馅饼
2017年8月11日馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼) .
经典 DP 问题中有一个数塔问题,数塔问题只能往两个方向走,而这个问题就是数塔问题的衍生版,这个问题可以往三个方向走.定义 dp[i][j]
为时间为i,所在位置为j时所能得到的最大数量.那么就有dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1])
.
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176
#include <cstdio>
#include <cstring>
using namespace std;
const int N = (int)1e5 + 5;
int dp[N][15];
int max(int a, int b, int c)
{
if (a >= b && a >= c)
return a;
else if (b >= a && b >= c)
return b;
else
return c;
}
int main()
{
int n;
while (~scanf("%d", &n) && n) {
int time = 0;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++) {
int t, x;
scanf("%d %d", &x, &t);
dp[t][x]++;
time = max(time, t, 0);
}
for (int i = time; i >= 0; i--) {
for (int j = 0; j <= 10; j++) {
if (j == 0) {
dp[i][j] += max(dp[i + 1][j], dp[i + 1][j + 1], 0);
} else if (j == 10) {
dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], 0);
} else {
dp[i][j] += max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1]);
}
}
}
printf("%d\n", dp[0][5]);
}
return 0;
}