思路:一個區間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;
}