hdu1176 免费馅饼 ——DP
May 25, 2013
Hdu
DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 题目大意: 中文题…… 题目思路: 类似于 Triangle 。d[i][j] 表示 i 时间在 j 位置的所得到的价值。然后就像 Triangle 一样从下往上递推。最终求在0秒的时候,在5位置上的值。 WA了两次,当初求的是0秒的时候,所有位置上的最大值,,这显然是不对的。因为起始位置是5啊。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 100000+10;
int a[MAX][11], d[MAX][11];
void init() {
int m, i, j, x, t, tMax = -1;
while (~scanf("%d", &m) && m) {
memset(a, 0, sizeof(a));
memset(d, 0, sizeof(d));
for (i = 0; i < m; ++i) {
scanf("%d%d", &x, &t);
if (tMax < t) tMax = t;
a[t][x]++;
}
for (i = 0; i <= 10; ++i) d[tMax][i] = a[tMax][i];
for (i = tMax-1; i>= 0; --i) {
for (j = 0; j <= 10; ++j) {
if (j == 0) {
d[i][j] = max(d[i+1][j], d[i+1][j+1]) + a[i][j];
continue;
}
else if (j == 10) {
d[i][j] = max(d[i+1][j], d[i+1][j-1]) + a[i][j];
continue;
}
d[i][j]=max(d[i+1][j], max(d[i+1][j+1], d[i+1][j-1]))+a[i][j];
}
}
printf("%d\n", d[0][5]);
}
}
int main(void) {
init();
return 0;
}
很多题目都是相通的