算法 - 动态规划

时间:2013-11-14 15:03:48

标签: arrays algorithm 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;
}

1 个答案:

答案 0 :(得分:1)

在此代码中,dp[i]表示不需要更改的元素的最大数量,以便在range [1, i]中获取此C值,并且我们不会更改{{1 }}

然后检查每个a[i],如果j > i,我们需要更改i和j之间的所有元素,然后|a[i] - a[j]| <= (j - i) * C