zoukankan      html  css  js  c++  java
  • 洛谷 1156 dp

    #洛谷1156 dp 类背包问题

    老久没有自己想出来过dp方程了,,,虽然到最后还是只写了30分,,,

    设dp[j]表示最大生命值为i时的最大高度,则对于每个物品,可以选择吃掉或者放上去,即转移为dp[j + p[i].eatLife] 或 dp[j] + p[i].putHeight

    注意转移顺序

    做这道题目的时候WA了一个世纪,死活找不出原因,最后在codevs上扣下来数据才终于Get到

    xs

    1.注意dp的初值设定,开始时没注意用的0,后来才发现需要搞成-inf,只把dp[10]设为0
    2.注意最大生存时间的计算,开始脑抽的认为吃掉所有垃圾,后来看到数据才意识到有些垃圾可能在扔下来之前就死了,需要判定

    
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    struct data {
        int putTime;
        int eatLife;
        int putHeight;
    };
    const int inf = 0x3f3f3f3f;
    const int maxn = 100 + 10;
    data p[maxn];
    int d, n;
    int dp[2000];
    int totTime;
    
    bool cmp(data aa, data bb) {
        return aa.putTime < bb.putTime;
    }
    
    
    int main () {
        scanf("%d %d", &d, &n);
        for (int i = 1; i <= n; i++) scanf("%d %d %d", &p[i].putTime, &p[i].eatLife, &p[i].putHeight);
        memset(dp, 192, sizeof(dp));
        dp[10] = 0;
        std :: sort(&p[1], &p[n+1], cmp);
        for (int i = 1; i <= n; i++) {
            for (int j = p[n].putTime; j >= p[i].putTime; j--) {
                dp[j + p[i].eatLife] = std :: max(dp[j + p[i].eatLife], dp[j]);
                dp[j] += p[i].putHeight;
            }
        }
        for (int i = 10; i <= p[n].putTime; i++) {
            if (dp[i] >= d) {
                printf("%d", i);
                return 0;
            }
        }
        int j = 10;
        for (int i = 1; i <= n && j >= p[i].putTime; i++) {
            j += p[i].eatLife;
        }    
        printf("%d", j);
        return 0;
    }
    
    
  • 相关阅读:
    Makefile:2:*** missing separator. Stop.
    Code笔记之:对使用zend加密后的php文件进行解密
    Apache 访问控制
    leetcode-21-合并两个有序链表
    tcp四次挥手的过程
    实现一个LRU算法
    redis为什么快
    二月春日
    你的支持会鼓励我更积极地创作
    静夜思·静夜祈愿
  • 原文地址:https://www.cnblogs.com/CtsNevermore/p/6014705.html
Copyright © 2011-2022 走看看