HDU1176_免费馅饼【号码塔】

简介:
免费馅饼


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26163    Accepted Submission(s): 8920

Problem Description
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。

说来gameboy的人品实在是太好了。这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼假设掉在了地上当然就不能吃了,所以gameboy立即卸下身上的背包去接。

但因为小径两側都不能站人。所以他仅仅能在小径上接。

因为gameboy平时老呆在房间里玩游戏,尽管在游戏中是个身手敏捷的高手。但在现实中运动神经特别迟钝,每秒种仅仅有在移动不超过一米的范围内接住坠落的馅饼。如今给这条小径如图标上坐标:

为了使问题简化,如果在接下来的一段时间里,馅饼都掉落在0-10这11个位置。

開始时gameboy站在5这个位置。因此在第一秒,他仅仅能接到4,5,6这三个位置中当中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(如果他的背包能够容纳无穷多个馅饼)
 
Input
输入数据有多组。每组数据的第一行为以正整数n(0<n<100000),表示有n个馅饼掉在这条小径上。

在结下来的n行中。每行有两个整数x,T(0<T<100000),表示在第T秒有一个馅饼掉在x点上。同一秒钟在同一点上可能掉下多个馅饼。

n=0时输入结束。
 
Output
每一组输入数据相应一行输出。

输出一个整数m。表示gameboy最多可能接到m个馅饼。


提示:本题的输入数据量比較大,建议用scanf读入,用cin可能会超时。



Sample Input
6
5 1
4 1
6 1
7 2
7 2
8 3
0
 
Sample Output
4
 
Author

lwg


题目大意:总共同拥有0~10个位置。gameboy站在5的位置上。给你馅饼

掉落的时间的位置。gameboy每秒仅仅能到自己位置临近的位置接馅饼。

比方在5的位置上仅仅能接到4 5 6的馅饼。在7的位置上仅仅能接到 6 7 8的

馅饼。问gameboy最后最多能接到多少馅饼。

思路:动态规划的思想。

将位置总体右移一个单位。位置为1~11。这样方便计算。

建立二维数组。一维代表时间。二维代表位置。点上的值代表馅饼的个数。

按时间顺序存储馅饼个数。

最后从底往上递推。

每次比較馅饼位置i和馅饼位置i-1和馅饼位置i+1的馅饼

个数。

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

dp[0][6]就是终于结果。

#include<stdio.h>
#include<string.h>

int dp[100010][12];
int main()
{
    int n,pos,time,Maxtime;
    while(~scanf("%d",&n) && n)
    {
        Maxtime = 0;
        memset(dp,0,sizeof(dp));
        for(int i = 1; i <= n; i++)
        {
            scanf("%d%d",&pos,&time);
            dp[time][pos+1]++;//pos为0的时候左边还得加推断,这里位置总体右移
            if(time > Maxtime)
                Maxtime = time;
        }

        for(int i = Maxtime-1; i >= 0; i--)
        {
            for(int j = 1; j <= 11;j++)
            {
                int num1 = dp[i+1][j-1];
                int num2 = dp[i+1][j];
                int num3 = dp[i+1][j+1];
                int Max = 0;
                if(Max < num1)
                    Max = num1;
                if(Max < num2)
                    Max = num2;
                if(Max < num3)
                    Max = num3;
                dp[i][j] += Max;
            }
        }

        printf("%d\n",dp[0][6]);
    }
    return 0;
}







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5048599.html,如需转载请自行联系原作者

相关文章
|
6月前
免费馅饼—(HDU - 1176)
免费馅饼—(HDU - 1176)
|
6月前
洛谷P1204 or SSL-1088 USACO 1.2 挤牛奶
洛谷P1204 or SSL-1088 USACO 1.2 挤牛奶
|
算法 C语言 C++
【数论】蚂蚁感冒、饮料换购、买不到的数目
长 100 厘米的细长直杆子上有 n只蚂蚁。
84 0
【洛谷】独自一人听歌写题
【洛谷】独自一人听歌写题
73 0
|
人工智能 BI Shell
UPC-购买巧克力(贪心)
UPC-购买巧克力(贪心)
104 0
|
机器学习/深度学习 C++
试题历届真题货物摆放【第十二届】【省赛】【B组】(C++)
小蓝有一个超大的仓库,可以摆放很多货物。现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 LL、WW、HH 的货物,满足 n = L \times W \times Hn=L×W×H。给定 nn,请问有多少种堆放货物的方案满足要求。 例如,当 n = 4n=4 时,有以下 66 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1
233 0
|
C语言 C++
蓝桥杯2016届省赛B组(生日蜡烛)
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
145 0
|
人工智能 安全
UPC-2021个人训练赛第20场-部分题解
RGB Triplets 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 Select Half 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 心灵的抚慰 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示
168 0