塗色paint BZOJ - 1260

題目傳送門

思路:一個區間DP的模版題,dp[i][j]代表字符串從i到j最少需要多少次染色,然後就是區間DP了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

#define MAXN 2010
#define MAXE 40
#define INF 1e9
#define MOD 100003
#define LL long long
#define ULL unsigned long long
#define pi 3.14159

using namespace std;

string str;
int dp[MAXN][MAXN];

int main() {
    std::ios::sync_with_stdio(false);
    cin >> str;
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= str.length(); ++i)
        dp[i][i] = 1;
    for (int i = 1; i <= str.length(); ++i) {
        for (int j = 1; j + i <= str.length(); ++j) {
            int pos = i + j;
            dp[j][pos] = INF;
            if (str[j - 1] == str[pos - 1]) {
                if (i == 1) {
                    dp[j][pos] = 1;
                } else {
                    dp[j][pos] = dp[j][pos - 1];
                }
            } else {
                for (int k = j; k < pos; ++k) {
                    dp[j][pos] = min(dp[j][pos], dp[j][k] + dp[k + 1][pos]);
                }
            }

        }
    }
    cout << dp[1][str.length()] << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章