[英]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.