DP問題,大致思路dp[i]=min(dp[j]+1),其中dp[i]爲從0開頭,到字符串第i個字符的子字符串的最優值,這個字串的後綴必然是迴文串(1個字符也看作迴文串)ios
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <cmath> #include <vector> using namespace std; const int maxl= 1005; char s[maxl]; int ispl[maxl][maxl], dp[maxl]; void Init(int l) { for (int i= 0; i< l; ++i){ ispl[i][i]= 1; } for (int w= 1; w< l; ++w){ int ui= l-w; for (int i= 0; i< ui; ++i){ ispl[i][i+w]= s[i]== s[i+w] && (ispl[i+1][i+w-1] || 1==w) ? 1 : 0; } } memset(dp, 0x3f, sizeof(dp)); } int main() { int n, l; scanf("%d", &n); while (n--){ scanf(" %s", s); l= strlen(s); Init(l); dp[0]= 1; for (int i= 1; i< l; ++i){ if (ispl[0][i]){ dp[i]= 1; continue; } for (int j= 0; j< i; ++j){ if (1== ispl[j+1][i]){ dp[i]= min(dp[i], dp[j]+1); } } } cout<<dp[l-1]<<endl; } return 0; }