P4170 [CQOI2007]涂色(区间dp)

传送门

思路:区间dp,如果区间两端是一样的颜色,则粉刷次数取分别去掉两端的两个区间的最小值

如果颜色不一样,则粉刷次数取i-k区间与k+1-j区间粉刷次数最小值的和

AC代码:

#include<bits/stdc++.h>
using namespace std;
string a;
int dp[55][55];
int main() {
    //freopen("test.txt", "r", stdin);
    cin >> a;
    int n = a.size();
    a.insert(a.begin(), 0);
    memset(dp, 0x3f, sizeof(dp));
    for (int i = 1; i <= n; i++) {
        dp[i][i] = 1;
    }
    for (int len = 2; len <= n; len++) {
        for (int i = 1, j = i + len - 1; j <= n; i++, j++) {
            if (a[i] == a[j]) {
                dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]);
            }
            else {
                for (int k = i; k < j; k++) {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
                }
            }
        }
    }
    cout << dp[1][n] << endl;
    return 0;
}

 

posted @ 2021-03-22 08:42  cono奇犽哒  阅读(39)  评论(0)    收藏  举报