HDU 1176 免费馅饼

2014-11-23 22:08:31 来源: 作者: 浏览: 3

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


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


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


AC代码:

 #include   
#include   
#include   
#include   
  
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;  
}  

#include
#include
#include
#include

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;
}


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: