zoukankan      html  css  js  c++  java
  • HDU 1176 免费馅饼 DP类似数塔题

    解题报告:

    小明走在一条小路上,这条小路的长度是10米,从左到右依次是0到10一共十个点,现在天上会掉馅饼,给出馅饼掉落的坐标和时间,一开始小明的位置是在坐标为5的位置,

    他每秒钟只能移动一米的距离,问他最多能得到多少个馅饼。

    这题可以说是一个动态规划题,就是一个数塔的变形,而且跟数塔的区别很小,我们可以把时间当成是数塔中的层,坐标就是数塔中的横向的位置,然后就是从时间最大的那一层出发,往时间最小的方向递归,最后得到的dp[0][5]就是我们所要的结果。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 int max(int a,int b,int c) {
     5     int ans = std::max(a,b); 
     6     return std::max(ans,c);
     7 }
     8 int map[100005][11];
     9 int main() {
    10     int n,x,t;
    11     while(scanf("%d",&n)&&n) {
    12         memset(map,0,sizeof(map));  //初始化都为0 
    13         int Tm = 0;          //求出最大的时间 
    14         for(int i = 1;i<=n;++i) {
    15             scanf("%d%d",&x,&t);
    16             Tm = std::max(Tm,t);
    17             map[t][x]++;
    18         }
    19         for(int i = Tm - 1;i>=0;--i)
    20         for(int j = 0;j<=10;++j) {
    21             if(j==0)
    22             map[i][j] += std::max(map[i+1][j],map[i+1][j+1]);
    23             else if(j==10)
    24             map[i][j] += std::max(map[i+1][j],map[i+1][j-1]);
    25             else map[i][j] += max(map[i+1][j-1],map[i+1][j],map[i+1][j+1]);
    26         }
    27         printf("%d
    ",map[0][5]);
    28     }
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    省选知识点
    寒假练习
    水题欢乐赛-套路
    2019年12月(2)
    洛谷P1347 排序
    Aizu
    2019年12月(1)
    【CSP2019】
    联系博主
    UVA1420 Priest John's Busiest Day【贪心】
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3197004.html
Copyright © 2011-2022 走看看