思路
很基本的dp,
由于初始状态只能在位置5,所以可以倒着dp,即从时间T到0。
状态转移方程
v[i][j] = max(v[i+1][j+1], v[i][j+1], v[i-1][j+1])
/ i为当前位置/ j为当前时间/ v[i][j]为接到的馅饼量
v[0][5]便为最终结果
代码
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <set>
#include <stack>
#include <stdlib.h>
#include <time.h>
using namespace std;
int v[12][100009];
int main()
{
int n;
while(cin>>n && n)
{
memset(v, 0, sizeof(v));
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
++v[a][b];
}
for(int i=100000; i>=0;i--)
{
for(int j=0;j<=10;j++)
{
int m = v[j][i+1];
if(j-1 >= 0)
m = max(m, v[j-1][i+1]);
if(j+1 <= 10)
m = max(m, v[j+1][i+1]);
v[j][i] += m;
}
}
cout<<v[5][0]<<endl;
}
return 0;
}