Rank3_鬆鬆的字符串
時間限制(普通/Java) : 2000 MS/ 6000 MS 運行內存限制 : 65536 KByte
總提交 : 55 測試通過 : 36
比賽描述
在一個陽光明媚的上午,鬆鬆寫下了"ababbab",時光說我可以把它劃分成一個迴文串。
接着時光寫下了"a(babbab)",鬆鬆爭着說,“哼,那我也可以"(a)(b)(a)(b)(b)(a)(b)"”,時光汗如雨下。“你能不能別這麼蠢,我那個可是劃分數量最少的。”
聰明的你可以告訴鬆鬆對於一個字符串S,最少可以劃分爲多少個迴文串。
輸入
一個字符串S。(|S|<=5000)
輸出
輸入最少的劃分數量。
樣例輸入
ababbab
樣例輸出
2
題目來源
NUPT
#include <cstring>
#include <iostream>
#include <cmath>
#include <string>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int MAXN = 5005;
char STRING[MAXN];
int l[MAXN];
int dp[MAXN];
bool Palindrome(int a, int b)
{
while (a < b)
{
if (STRING[a] != STRING[b]) return false;
a++; b--;
}
return true;
}
int main()
{
cin >> STRING;
int n = strlen(STRING);l[0] = -1;l[1] = 0;dp[0] = 0;dp[1] = 1;
int result = 1;
for (int i = 1; i < n; i++)
{
dp[i+1] = dp[i] + 1;
l[i+1] = i;
int temp = l[i] - 1;
if (temp >= 0 && STRING[i] == STRING[temp])
{
dp[i+1] = min(dp[i+1], dp[temp] + 1);
l[i+1] = temp;
}
for (int j = l[i]; j < i; j++)
{
if (Palindrome(j, i))
{
l[i+1] = min(l[i+1], j);
dp[i+1] = min(dp[i+1], dp[j] + 1);
}
}
}
cout << dp[n] << endl;
return 0;
}