hdu 1176 竟然是数塔问题

刚开始做时思路过于局限,只考虑局部的递推,没有全局观导致,越推越复杂,

最后看到网上答案,精髓啊

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int max3(int a,int b,int c)
{
    a = a>b?a:b;
    a = a>c?a:c;
    return a;
}
int max2(int a,int b)
{
    a = a>b?a:b;
    return a;
}
int t[100001][11];
int main()
{
    int n,T,x,max;
    while(scanf("%d",&n)&&n)
    {
        memset(t,0,sizeof(t));
        max = 0;
        while(n--)
        {
            scanf("%d %d",&x,&T);
            t[T][x]++;
            max = max>T?max:T;
        }
        for(int i = max-1; i >= 0; i--)
        {
            for(int j = 0; j <= 10; j++)
            {
                if(j==0)t[i][j] += max2(t[i+1][j],t[i+1][j+1]);
                else if(j==10) t[i][j] += max2(t[i+1][j],t[i+1][j-1]);
                else t[i][j] += max3(t[i+1][j-1],t[i+1][j],t[i+1][j+1]);
            }
        }
        cout<<t[0][5]<<endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/jackes/p/2454783.html