涂色paint BZOJ

来源:互联网 发布:晨曦是什么软件 编辑:程序博客网 时间:2024/06/05 03:19

题目传送门

思路:一个区间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.14159using 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;}
原创粉丝点击