我先看了一些题解,有点不清楚为啥一定要分成两个小区间(我不知道我的dp思路哪里错了)
#include <iostream>
#include <cstring>
using namespace std;
string target;
int dp[105][105];
int main() {
cin >> target;
int n = target.size();
memset(dp, 0x3f3f3f, sizeof(dp));
for (int i = 0; i < n; i++) {
dp[i][i] = 1;
}
for (int len = 2; len <= n; len++) {
for(int l = 0;l + len - 1 < n;l++) {
int r = l + len - 1;
if (target[l] == target[r]) {
if (len == 2) {
dp[l][r] = 1;
}
else {
dp[l][r] = min(min(1 + dp[l + 1][r - 1],1 + dp[l + 1][r]),1 + dp[l][r - 1]);
}
}
else {
if (len == 2) {
dp[l][r] = 2;
}
else {
dp[l][r] = min(min(2 + dp[l + 1][r - 1], 1 + dp[l + 1][r]), 1 + dp[l][r - 1]);
}
}
if (target[l] == target[l + 1]) {
dp[l][r] = min(dp[l][r], dp[l + 1][r]);
}
if (target[r] == target[r - 1]) {
dp[l][r] = min(dp[l][r], dp[l][r - 1]);
}
//cout << "dp[" << l << "][" << r << "] = " << dp[l][r] << endl;
}
}
cout << dp[0][n - 1];
}