迴文串最少劃分數
阿新 • • 發佈:2019-02-12
這個是正向分析字串,覺得比較好理解.
這個問題以後還要補充……
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
int len;
char s[5005];
char s1[5005];
int dp[5005];
int v[5005][5005];
void input()
{
scanf("%s", s1);
len = strlen(s1);
strcpy(s + 1, s1);
}
void solve()
{
int i, j;
for (i = 0; i <= len; i++)
{
v[i][i] = 1;
}
for (i = 1; i <= len; i++)
{
dp[i] = i;
for (j = i; j >= 1; j--)
{
if (i == j)
{
dp[i] = min(dp[i], dp[i - 1] + 1);
}
else if (i - j == 1 && s[i] == s[j])
{
v[j][i] = 1;
dp[i] = min(dp[i], dp[j-1] + 1);
}
else if (v[j + 1][i - 1]&&s[i]==s[j])
{
v[j][i] = 1 ;
dp[i] = min(dp[i], dp[j-1] + 1);
}
}
}
printf("%d", dp[len]);
}
int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout);
input();
solve();
//system("pause");
return 0;
}