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; }