UVA 11584 划分回文字串
将其划分为尽可能少的回文串
dp[i] = min(dp[i],dp[j] + 1) 来表示j+1~i是回文串
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define MAX 0x3f3f3f3f using namespace std; char p[1005]; bool work(int i,int j) { for(int k = 0; k <=(j-i)/2; k++) if(p[i+k] != p[j-k]) return false; return true; } int dp[1005]; int main() { int n; scanf("%d",&n); while(n--) { getchar(); scanf("%s",p); int len = strlen(p); for(int i = 0;i < len;i++) dp[i] = i+1; //回文串为单个字母的情况 for(int i = 0;i < len;i++) if(work(0,i)) dp[i] = 1; //包含首位的回文串 for(int i = 0; i < len; i++) for(int j = 0; j < i; j++) if(work(j+1,i)) //j+1 从第二位开始判断 dp[i] = min(dp[i],dp[j] + 1); printf("%d\n",dp[len-1]); } return 0; }