合并金子(区间dp)

原题链接

 

很久没做dp了,连一道裸地区间dp都没能第一时间想到,我可真是个臭弟弟......

一开始是用的贪心吧,wa了一发。

 

本题思路:区间dp的一般思路,先枚举区间长度,然后枚举区间头,然后枚举区间断点,很容易就能想到状态转移方程。

 

自己关掉博客好好想想吧,区间dp应该是最简单的dp类型了。

 

#include <iostream>
using namespace std;

const int maxn = 30 + 5, inf = 0x3f3f3f3f;

int val[maxn], sum[maxn][maxn], dp[maxn][maxn];

int n;

int main() {
    cin >> n;
    for(int i = 1; i <= n; i ++) {
        cin >> val[i];
        sum[i][i] = val[i];
    }
    for(int i = 1; i <= n; i ++) {
        for(int j = i; j < n; j ++) {
            sum[i][j + 1] = sum[i][j] + val[j + 1];
        }
    }
    for(int len = 1; len < n; len ++) {
        for(int i = 1; i + len <= n; i ++) {
            int j = i + len;
            dp[i][j] = inf;
            for(int k = i; k <= j; k ++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j]);
            }
        }
    }
    cout << dp[1][n] << endl;
    return 0;
}

 

posted @ 2020-03-23 17:56  Cruel_King  阅读(195)  评论(0编辑  收藏  举报