// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432 // 又是看了题解才写出题目的一次,题解说染色问题优先想到dp /*#include <iostream> #include <string> #include <vector> #define pre(i, j, k) for (int i = j; i < k; i++) using namespace std; int main() { ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0); string s; cin >> s; char lc, rc; int ans = 0; size_t size = s.size(); int l = 0, r = s.size() - 1; while(l < r){ while(l + 1 < size && s[l] == s[l + 1]) l++; while(r - 1 > -1 && s[r] == s[r - 1]) r--; if (l >= r){ ans++; break; } if (s[l] == s[r]){ ans++; l++; r--; } else if (s[l] == s[r - 1] || s[l + 1] == s[r]){ ans++; if (s[l] == s[r - 1]) r--; else l++; } else } } // 64 位输出请用 printf("%lld")*/ #include<iostream> #include<algorithm> #include<string> #define pre(i,j,k) for(int i = j; i < k; i++) using namespace std; int dp[60][60]; int main(){ ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0); string s; cin >> s; size_t size = s.size(); pre(len, 1, 1 + size){ pre(i, 0, size){ int j = i + len - 1; if (j >= size) break; dp[i][j] = 0x3f3f3f3f;//--------初始化,不然后面不能min if (i == j) dp[i][j] = 1;//----------如果只有一个板子一个颜色那么就涂一次 else if (s[i] == s[j]) dp[i][j] = min(dp[i][j - 1], dp[i + 1][j]);//---------如果两端相等,可以让两端共用一次涂色 else {//----------否则枚举出最小 pre(k, i, j){ dp[i][j] = min(dp[i][k] + dp[k + 1][j], dp[i][j]); } } } } cout << dp[0][size - 1]; return 0; }