1. 程式人生 > >#132-(EZOI動態規劃練習)[動態規劃]單詞的劃分

#132-(EZOI動態規劃練習)[動態規劃]單詞的劃分

Description

有一個很長的由小寫字母組成的字串。為了便於對這個字串進行分析,需要將它劃分成若干部分,每部分稱為一個單詞。出於減少分析量的目的,希望劃分出的單詞數越少越好。

Input

第1行1個字串,長度不超過100。 第2行1個整數n,表示單詞的個數,n<=100。 第3~n+2行,每行列出1個單詞。  

Output

一行一個正整數,表示字串可以被劃分成的最少的單詞數。

Sample Input

realityour
5
real
reality
it
your
our

Sample Output

2

直接一個動規

#if 0
ispispisp
10
ispis
pisp
is
pispis
p
2
2
2
2
2
#endif

#include <iostream>
#include <string>
#include <set>

#define SIZE 110
#define INF 2e+09

using namespace std;

set<string> st[SIZE];
string s, temp;
int dp[SIZE];

int main(void)
{
	int n, m, i, j;
	
	cin >> s;
	scanf("%d", &m);
	while (m--)
	{
		cin >> temp;
		st[temp.size()].insert(temp);
	}
	
	n = s.size();
	for (i = 0; i < n; ++i) // 動態規劃過程
	{
		dp[i] = INF;
		for (j = 1; j <= i + 1; ++j)
		{
			if (st[j].count(s.substr(i - j + 1, j))) // 如果這個子串出現在了單詞集合裡
			{
				dp[i] = min(dp[i], (j == i + 1) ? 1 : dp[i-j] + 1); // 條件轉移方程
			}
		}
	}
	
	printf("%d", dp[n-1]);
	
	return 0;
}