[HDU]1176免费馅饼

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

乍一看和塔数很像(http://www.cnblogs.com/sjy123/p/3241995.html),其实就是很像,一个升级版的塔数。

-----------------------------------------------分割线--------------------------------------------------

         5                         t=0
       456                        t=1
     34567                       t=2
    2345678                    t=3
  123456789                  t=4
012345678910               t=5
012345678910               t=6

总体来说,这道题就是上面这样的塔数,很明显,第i层的0只能从上一层的0,1中最大的来,倒推的话,也是一样的,第i层的0也只能由下一层的0,1来,(t=5之前实际没有0,因为走不到那,但是我们可以假设有),同理,每行的10也只能有下一行9,10推出来。

-----------------------------------------------分割线------------------------------------------------

#include"stdio.h"
#include"stdlib.h"
int dp[100110][11];
int maxabc(int a,int b)
{
    int max;
    max=a>b?a:b;
    return max;
}
int main()
{
    int n,i,j,tmax,x,y;
    while(scanf("%d",&n)&&n)
    {
           for(i=0;i<100110;i++)         //初始化 
            for(j=0;j<11;j++)
            dp[i][j]=0;                      
           for(i=0;i<n;i++)
           {
              scanf("%d%d",&x,&y);
              if(i==0)
              tmax=y;                   //记录最后出现时间 
              else if(y>tmax) tmax=y;
              dp[y][x]++;
           }        
           for(i=tmax-1;i>=0;i--)        //倒推 
           {
                dp[i][0]+=dp[i+1][0]>dp[i+1][1]?dp[i+1][0]:dp[i+1][1];
                dp[i][10]+=dp[i+1][9]>dp[i+1][10]?dp[i+1][9]:dp[i+1][10];
                for(j=1;j<=9;j++)
                dp[i][j]+=maxabc(dp[i+1][j-1],maxabc(dp[i+1][j],dp[i+1][j+1]));
           }  
           printf("%d
",dp[0][5]);          
    }
    //system("pause");
}
原文地址:https://www.cnblogs.com/sjy123/p/3242730.html