HDU - 1176 免费馅饼(数塔类型DP)
题目链接:
大致题意:
在0到10的坐标上,会掉落n个馅饼,给出馅饼掉落的位置和时间,主人公一次只能接到他所在位置即左右三个位置上掉落的馅饼,求主人公最多可以接到多少馅饼(初始在5这个位置)
解题思路:
数她 逆着dp
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 15, M = 1e5 + 10;
int n;
int w[N][M]; //在i的位置第j时间掉落的馅饼数
int f[N][M]; //在i的位置第j时间接到的最多馅饼数
int main() {
while (cin >> n, n) {
memset(w, 0, sizeof w);
memset(f, 0, sizeof f);
int x, t, maxt = 0;
for (int i = 0; i < n; ++i) {
scanf("%d%d", &x, &t);
//cin >> x >> t;
w[x][t]++;
maxt = max(maxt, t);
}
for (int i = 0; i < N; ++i)f[i][maxt] = w[i][maxt]; //初始化
for (int j = maxt - 1; j >= 0; --j)
for (int i = 0; i <= 10; ++i)
f[i][j] = max(f[i - 1][j + 1], max(f[i][j + 1], f[i + 1][j + 1])) + w[i][j];
cout << f[5][0] << endl;
}
return 0;
}
END
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
Java多线程-交叉打印26个字母
