题意:给定一个字符串,分解成多个子串,每个子串都是回文串,问最少能分成多少个子串。
题解:
dp[i]表示前i个字符串分割成最少回文子串的数量;
0<=j<=i;如果字符串从j到i是回文串,那么dp[i]=min(dp[i],dp[j-1]+1);
#include <iostream> using namespace std; int dp[1005]; string s; bool ok(int j,int i) { while(j<=i) { if(s[j]!=s[i]) return false; i--; j++; } return true; } int main() { int n; cin>>n; while(n--) { cin>>s; int len=s.length(); for(int i=0;i<len;i++) dp[i]=i+1; for(int i=1;i<len;i++) for(int j=0;j<=i;j++) { if(ok(j,i)) { if(j==0) dp[i]=1; else dp[i]=min(dp[j-1]+1,dp[i]); } } cout<<dp[len-1]<<endl; } return 0; }