原题链接:
https://vjudge.net/problem/HDU-1176
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
//逆转时间,最后a[0][5](初始位置)即为最后答案
int a[100001][20]; //a[t][x] 在t时刻移动到x位置的馅饼数量
int n;
//最大时间
while (cin >> n && n)
{
//因为有多组数据 所以要初始化
int maxt = 0;
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
{
int x, t;
cin >> x >> t;
a[t][x]++;
if (maxt < t)
maxt = t;
}
for (int i = maxt - 1; i >= 0; i--)
{
for (int j = 0; j <= 10; j++)
{
//某一时刻的某一位置能拿到的最大数量等于
//它上一秒钟周围三个地方能拿到的最大数量(已经拿到的)加它本身(将拿到的)
int temp;
temp = max(a[i + 1][j - 1], a[i + 1][j]);
temp = max(temp, a[i + 1][j + 1]);
a[i][j] += temp;
}
}
cout << a[0][5] << endl;
}
}
网上大佬的思路,逆向dp,着实牛逼,跪了Orz