zoukankan      html  css  js  c++  java
  • HDU_1176_免费馅饼_16.4.23再做

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176

    免费馅饼

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


    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
     
    第二次做,第一次的想法一点也记不得。。。
    输入z(坐标),t(时刻),abs(z-5)<t表明,该时刻该点的馅饼一定接不到,故不存。
    状态转移:
    for(int i=1; i<=maxt; i++)
        for(int j=0; j<=10; j++)
        {
            if(j==0)
                dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+pai[j][i];
            else if(j==10)
                dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+pai[j][i];
            else
                dp[i][j]=max(max(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+pai[j][i];
         }

    dp[100005(i)][15(j)]表示第i秒时,第j个点上接到馅饼的最大值。

    相当与用1e7的复杂度算了所有情况。

    看网上说是个简单的数塔,虽然不知道是什么,但是从dp的更新中可以领会一些意思。

    注意理解每个时刻的dp的更新情况,该时刻不可能到达的点的值一定是零。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<stdlib.h>
    using namespace std;
    #define maxt 100005
    int dp[100005][15];
    int pai[15][100005];
    int main()
    {
        int n,z,t;
        while(scanf("%d",&n)!=EOF&&n)
        {
            memset(pai,0,sizeof(pai));
            memset(dp,0,sizeof(dp));
            for(int i=0; i<n; i++)
            {
                scanf("%d%d",&z,&t);
                if(abs(z-5)<=t)
                    pai[z][t]++;
            }
            for(int i=1; i<=maxt; i++)
                for(int j=0; j<=10; j++)
                {
                    if(j==0)
                        dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+pai[j][i];
                    else if(j==10)
                        dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+pai[j][i];
                    else
                        dp[i][j]=max(max(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+pai[j][i];
                }
                int res=0;
            for(int i=0;i<=10;i++)
            {
                if(dp[maxt][i]>res)
                    res=dp[maxt][i];
            }
            printf("%d
    ",res);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    webstorm 格式化代码及常用快捷键
    Jetbrains 2018 等系列软件激活破解除去黄色警告框方法(含多个平台)
    HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
    为什么macos开机黑屏但是有声音?
    mac 回车键、空格键失灵(非物理原因)解决方法
    在VS代码中使用版本控制
    在Visual Studio代码中使用Flask
    [IOI1999]花店橱窗布置(DP路径记录)
    leetcode:Minimum Path Sum(路线上元素和的最小值)【面试算法题】
    c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/5425497.html
Copyright © 2011-2022 走看看