题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176
思路:据说是DP题(时间dp)
动态转移:dp[ i ][ j ]+=max(dp[ i+1 ][ j-1 ],dp[ i+1 ][ j ],dp[ i+1 ][ j+1 ]);
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define max(a,b) (a)>(b)?(a):(b)
#define N 100005
int dp[N][11];
int main()
{
int n,x,t,i,j,maxt;
while(scanf("%d",&n)&&n)
{
memset(dp,0,sizeof(dp));
maxt=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&t);
dp[t][x]++;
if(maxt<t) maxt=t;
}
for(i=maxt;i>=0;i--)
{
dp[i][0]+=max(dp[i+1][0],dp[i+1][1]);//左边界特殊考虑
for(j=1;j<=9;j++)
dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);
dp[i][10]+=max(dp[i+1][9],dp[i+1][10]);//右边界特殊考虑
}
printf("%d\n",dp[0][5]);
}
return 0;
}