http://acm.hdu.edu.cn/showproblem.php?pid=1176

类似数塔的dp,注意边界处理!!!

View Code
#include <stdio.h>
#include <string.h>
int dp[110000][30];
int max3(int a,int b,int c)
{
    int maxnum=a;
    if(maxnum<b)maxnum=b;
    if(maxnum<c)maxnum=c;
    return maxnum;
}
int max2(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int n,x,T;
    int i,j;
    int maxnum;
    while(scanf("%d",&n),n)
    {
        memset(dp,0,sizeof(dp));
        maxnum=-10000000;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&x,&T);
            dp[T][x]++;
            if(maxnum<T)maxnum=T;
        }
        for(i=maxnum;i>=0;i--)
            for(j=10;j>=0;j--)
                if(j==0)
                    dp[i][j]+=max2(dp[i+1][j],dp[i+1][j+1]);
                else if(j==10)
                    dp[i][j]+=max2(dp[i+1][j],dp[i+1][j-1]);
                else
                    dp[i][j]+=max3(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
        printf("%d\n",dp[0][5]);
    }
    return 0;
}