动态规划题。。。。。由于终点很多,但起点只有一个 考虑采用逆向DP
dp[i][j]表示第I秒第j个位置能拿到的最多的馅饼数,类比数塔,易推得状态转移方程,最终答案即为dp[0][5]
#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
int dp[N][12],a[N][12];//aij表示第i秒有j位置有几个馅饼
int main()
{
int n,maxt;
while(cin >> n and n != 0)
{
maxt = 0;
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
{
int t,b;
scanf("%d %d",&b,&t);
++a[t][b];
maxt = max(t, maxt);
}
for(int i = 0; i < 11; i++) dp[maxt][i] = a[maxt][i];
for(int i = maxt - 1; i >= 0; --i)
{
for(int j = 0; j < 11; ++j)
{
dp[i][j] = max(j >= 1? dp[i + 1][j - 1] : -1, max(dp[i + 1][j], j <= 9 ? dp[i + 1][j + 1] : -1) ) + a[i][j];
}
}
cout << dp[0][5] << endl;
}
return 0;
}