题目分析:和数塔差不多,dp[i][j]。行代表时间,列代表位置,
状态转移方程:dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
注意边界,WA了几次,在j==0和10的时候,要注意!!!
#include<iostream>
#include<cstdio>
using namespace std;
int dp[100010][15];
int main()
{
int n,x,t;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x,&t);
dp[t][x]++;
}
for(int i=100000;i>=0;i--)
for(int j=10;j>=0;j--)
{
if(j==0)
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
else if(j==10)
dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j]);
else
dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);
}
int ans=dp[0][5];
printf("%d\n",ans);
}
system("pause");
return 0;
}