HDU 1176 免费馅饼

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


中文题,问题很简单,就是求他最多能接到多少个馅饼

这个题如果打出二维时间位置表很容易看出来和 杭电2084数塔  一样,都可以从最下面开始往上推,看总和最大。他能走的除了在0和10位置外都有3种选择。
如下图括号里面的是和。  行代表时间t,列代表位置。

注意:起点必须是从5开始(绿色区域),所以最终求的结果应该是这里的最大值。
HDU 1176 免费馅饼

AC代码:
#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>



using namespace std;



int dp[100010][11];



int main()

{

    int n,i,j,maxx,tim,x,t;

    while(scanf("%d",&n)&&n)

    {

        tim = 0;

        memset(dp,0,sizeof(dp));

        for(i = 0; i < n; i++)

        {

            scanf("%d%d",&x,&t);

            dp[t][x]++;

            if(t > tim)        //记录最大时间

            {

                tim = t;

            }

        }

        maxx = 0;

        for(i = tim-1; i >= 0; i--)  //从倒数第二层开始求和

        {

            for(j = 0; j < 11; j++)

            {

                if(j == 0)

                {

                    dp[i][j] = max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j+1]);



                }

                else

                {

                    if(j == 10)

                    {

                        dp[i][j] = max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j-1]);

                    }

                    else

                    {

                        dp[i][j] = max(max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j-1]),dp[i][j]+dp[i+1][j+1]);

                    }

                }

                if(dp[i][j] > maxx)

                {

                    maxx = dp[i][j];

                }

            }

        }

        printf("%d\n",dp[0][5]);

    }



    return 0;

}



 

你可能感兴趣的:(HDU)