Edu Div.2 E. FTL(dp)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Edu Div.2 E. FTL(dp)相关的知识,希望对你有一定的参考价值。

Edu Div.2 E. FTL(dp)

第一维度枚举生命值,

先枚举单独进行t1和t2的转移。

第二维枚举共同发射的时候进行了多少次t1或t2。

时间复杂度: O ( h 2 ) O(h^2) O(h2)

参考jiangly的代码。

#include <bits/stdc++.h>

using i64 = long long;

int main() 
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int p1, p2, h, s;
    i64 t1, t2;
    
    std::cin >> p1 >> t1 >> p2 >> t2 >> h >> s;
    
    std::vector<i64> dp(h + 1);
    dp[0] = 0;
    for (int i = 1; i <= h; i++) 
        dp[i] = std::min(dp[std::max(0, i - (p1 - s))] + t1, dp[std::max(0, i - (p2 - s))] + t2);
        for (int j = 1; j <= i; j++) 
            if (j * t1 >= t2) 
                i64 dmg = (j - 1) * (p1 - s) + (j * t1 - t2) / t2 * (p2 - s) + (p1 + p2 - s);
                dp[i] = std::min(dp[i], dp[std::max(0LL, i - dmg)] + j * t1);
            
            if (j * t2 >= t1) 
                i64 dmg = (j - 1) * (p2 - s) + (j * t2 - t1) / t1 * (p1 - s) + (p1 + p2 - s);
                dp[i] = std::min(dp[i], dp[std::max(0LL, i - dmg)] + j * t2);
            
        
    
    std::cout << dp[h] << "\\n";
    
    return 0;

以上是关于Edu Div.2 E. FTL(dp)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #455 (Div. 2) E. Coprocessor DAG图上dp

Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分答案+状压dp

Codeforces Round #727 (Div. 2) E. Game with Cards(巧妙dp的优化)

Codeforces Round #727 (Div. 2) E. Game with Cards(dp优化,从n^2到nlog到n)

Codeforces Round #316 (Div. 2)E. Pig and Palindromes DP

Codeforces Round #646 (Div. 2) E. Tree Shuffling(贪心/树形DP)