分析: 和2084的数塔非常相似,不同的只是此题只用求三个数的最值。其实本质一样的,即自顶向底找一条权值最大的路径。理解数塔,这题也就更好理解了。
对于每一个位置,它下方的三个数是它下一秒可以到达的位置。
因此要求0秒5位置可以或得的最大值,只需自底向上更新数据。
dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
dp[i][j] 表示,第i秒,在位置j处可或得的最大值。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100002
int dp[N][15];
int maxx(int a,int b,int c)
{
a=max(a,b);
c=max(a,c);
return c;
}
int main()
{
int n,x,t;
while(scanf("%d",&n),n)
{
int max_t=0;
memset(dp,0,sizeof(dp));
while(n--)
{
scanf("%d%d",&x,&t);
dp[t][x]++;
max_t=max(max_t,t);
}
for(int i=max_t-1;i>=0;i--)
for(int j=0;j<11;j++)
dp[i][j]+=maxx(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
printf("%d\n",dp[0][5]);
}
return 0;
}