簡體   English   中英

算法 - 動態規划

[英]Algorithms - Dynamic Programming

給定n個元素的數組a1,a2 ...... an。 如果我們定義函數C = max | a(i + 1)-a(i)| 對於i = 2到n-1。 所以我們可以為我們的數組計算C的值。 現在的問題是,如果給出數組和C的某個值,那么應該改變數組中的多少個元素來獲得C的這個值?

這是此代碼問題解決方案的一部分: http//codeforces.com/contest/361/problem/D

它是使用動態編程解決的,但我不明白答案。 有誰可以向我解釋一下? 這是代碼。

/* x is the value of the function 
n the size of the array

*/
int Cal(LL x){ 
    for(int i = 1; i <= n; i++)
        dp[i] = 0;
    for(int i = 1; i <= n; i++){
        for(int j = i + 1; j <= n; j++){
            if(abs(a[i] - a[j]) <= 1ll * (j - i) * x) {
                dp[j] = max(dp[j], dp[i] + 1);
            }
        }
    }
    int ret = 0;
    for(int i = 1; i <= n; i++)
        ret = max(ret, dp[i] + 1);
    return n - ret;
}

在該代碼中, dp[i]表示不需要改變的元素的最大數量,以便在range [1, i]獲得該C的值,並且我們不改變a[i]

然后檢查每個j > i ,如果|a[i] - a[j]| <= (j - i) * C |a[i] - a[j]| <= (j - i) * C ,我們需要改變i和j之間的所有元素,然后dp[j] = max(dp[j], dp[i] + 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM