iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

問題

這邊一樣以 AtCoder Educational DP Contest 的類題來舉例,這題是 B - Frog 2,簡單來說一隻青蛙可以一次走 https://chart.googleapis.com/chart?cht=tx&chl=1 ~ https://chart.googleapis.com/chart?cht=tx&chl=k 步,然後每一步的價值就是前面和這一步的高度差,然後要找從第一步到最後一步花費的最低價值

解題思路

可以發現這一題跟昨天相比又有一點不同,他最多可以一次走 https://chart.googleapis.com/chart?cht=tx&chl=k 步,不過仔細一看發現 https://chart.googleapis.com/chart?cht=tx&chl=1%20%5Cle%20k%20%5Cle%20100,所以就算你直接枚舉找出走到每一步的最小成本也只會是 https://chart.googleapis.com/chart?cht=tx&chl=O(n%20%5Ctimes%20k) 而已,而這邊的 https://chart.googleapis.com/chart?cht=tx&chl=nhttps://chart.googleapis.com/chart?cht=tx&chl=2%20%5Cle%20n%20%5Cle%2010%5E5,所以乘起來就是 https://chart.googleapis.com/chart?cht=tx&chl=10%5E7,完全是可以的範圍

AC Code

#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    long long n,k;
    cin >> n >> k;
    vector<long long> stone(n),dp(n,INT_MAX);
    for(int i = 0;i < n;i++){
        cin >> stone[i];
    }
    dp[0] = 0;
    for(int i = 1;i < n;i++){
        for(int j = 1;j <= k;j++){
            if(i - j >= 0){
                dp[i] = min(dp[i - j] + abs(stone[i] - stone[i - j]),dp[i]);
            }
        }
    }
    cout << dp[n - 1] << "\n";
    return 0;
}

時間複雜度

前面有提到會需要枚舉走 https://chart.googleapis.com/chart?cht=tx&amp;chl=k 步的情況,所以是 https://chart.googleapis.com/chart?cht=tx&amp;chl=O(n%20%5Ctimes%20k)

總結

由此可知其實 DP 一種經典題就可以改成好幾種形式與延伸,所以要在賽中解出 DP 題只能平常多多練習,或是你有很強的思考能力才有辦法

預告

看起來應該到完賽日都寫不完,不過我認為 AtCoder Educational DP Contest 是很好的題組,包含許多 DP 經典題,可以一題一題練習,我相信這樣的日常練習在賽中會有很大的幫助


上一篇
Day26 - 動態規劃經典題-爬樓梯問題(改)
下一篇
Day28 - 動態規劃例題-不定型
系列文
從競賽程式學習資料結構與演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言