動態規劃之鬆鬆的字符串

                                       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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章