很简单的一道划分型DP题
可是花了我很长时间啊~/(ㄒoㄒ)/~
老是有BUG~~还是练得少~~
NOIP快到了怎么办啊~~
题目描述:
输入一个长度不超过1000的字符串,将它分成尽量少的回文串
输出回文串最少的个数
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int INF = 214748;
string s0;
int dp[1005][1005];
bool check(int i,int j)
{
for(int x = 0;i+x<=j-x;x++)
if(s0[i]!=s0[j])return false;
return true;
}
int main()
{
cin >> s0;
int n = s0.size();
for(int i = 0;i<=n;i++)
for(int j = 0;j<=n;j++)
dp[i][j] = INF;
for(int i = 0;i<n;i++)
dp[i][i] = 1;
for(int L = 1;L<n;L++)
for(int i = 0;i+L<n;i++)
{
int j = i+L;
if(check(i,j))
{dp[i][j]=1;}
else
{
for(int k = i;k<j;k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
cout << dp[0][n-1];
return 0;
}