想了好久,突然看到了話題是動態規劃,就明白了。
先n^2預處理出來以每個字符結尾的迴文串。然後動規,對於每一個字符,要麼自成一家,要麼接在前面的字符上。
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
string s;
vector<int> a[5050];
int f[5050];
int main(){
cin >> s;
int len = s.length();
for(int i = 0; i < len; i++){
int l = i, r = i;
int tot;
while(l >= 0 && r < len && s[l] == s[r]){
a[r].push_back(l);
l--, r++;
}
}
for(int i = 0; i < len; i++){
int l = i, r = i + 1;
while(l >= 0 && r < len && s[l] == s[r]){
a[r].push_back(l);
l--, r++;
}
}
f[0] = 1;
for(int i = 1; i < len; i++){
f[i] = f[i - 1] + 1;
for(int j = 0; j < a[i].size(); j++){
int t = a[i][j];
if(t == 0) f[i] = 1;
else f[i] = min(f[i], f[t - 1] + 1);
}
}
printf("%d\n", f[len - 1]);
return 0;
}