uva10003 Cutting Sticks

题目链接

题目大意

一根长为len的木棍,上面有n个点需要切割,切割完之后有n+1根木棍。没切一根木棍时的费用等于木棍的长度,求最小的费用和。

思路

记忆化搜索。solve(l, r) = min(solve(l,k) + solve(k,r)) + a[r] - a[l]。l < k < r。
或者是dp,dp[l][r] = min(dp[l][k] + d[k][r] + a[r] - a[l]),l < k < r。
int solve(int l,int r) {//[0,n+1]
    if (dp[l][r]) return dp[l][r];
    if (l == r - 1) return 0;
    dp[l][r] = INF;
    for (int i = l + 1;i < r;++i) {
        dp[l][r] = min(dp[l][r], solve(l, i) + solve(i, r) + a[r] - a[l]);
    }
    return dp[l][r];
}
/****************************************/
a[0] = 0, a[n+1] = len;
memset(dp, 0,sizeof dp);
for (int d = 2;d <= n + 1;++d) {
    for (int l = 0;l + d <= n + 1;++l) {
        int r = l + d;
        dp[l][r] = INF;
        for (int k = l + 1;k < r;++k)
            dp[l][r] = min(dp[l][r], dp[l][k] + dp[k][r] + a[r] - a[l]);
    }
}

你可能感兴趣的:(记忆化搜索,区间DP)