POJ 3267 The Cow Lexicon 基礎DP

The Cow Lexicon
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 9199   Accepted: 4369

Description

Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication system, based on mooing, is not very accurate; sometimes they hear words that do not make any sense. For instance, Bessie once received a message that said "browndcodw". As it turns out, the intended message was "browncow" and the two letter "d"s were noise from other parts of the barnyard.

The cows want you to help them decipher a received message (also containing only characters in the range 'a'..'z') of length L (2 ≤ L ≤ 300) characters that is a bit garbled. In particular, they know that the message has some extra letters, and they want you to determine the smallest number of letters that must be removed to make the message a sequence of words from the dictionary.

Input

Line 1: Two space-separated integers, respectively: W and L 
Line 2: L characters (followed by a newline, of course): the received message 
Lines 3..W+2: The cows' dictionary, one word per line

Output

Line 1: a single integer that is the smallest number of characters that need to be removed to make the message a sequence of dictionary words.

Sample Input

6 10
browndcodw
cow
milk
white
black
brown
farmer

Sample Output

2

Source


題意:給你一個比較長的字符串和一些相對短的字符串,問你最少去掉多少個字符使得剩下的長字符序列都是由短字符序列組成的;
思路:用dp[i]表示前i個字符最少去掉字符的數量;而且每次比較時應該從後往前,因爲每當增加一個字符時,會不會使得去掉字符的數量變得更小,即可以得出狀態轉移方程爲:dp[i] = min(dp[i],(i-p1)-len+1+dp[p1-1]))(當以第i個字符能由其中某個短字符序列組成時,p1爲前i個字符序列從後往前和短字符序列比較時結束的位置下標,len爲該短字符序列的長度),反之dp[i] = d[i-1]+1;
代碼:
#include<cstdio>  
#include<cstring>
#include <algorithm>
#include <cmath>
using namespace std;  
#define maxn 100007
#define inf 0x3f3f3f3f
typedef long long LL;
char s1[333],s2[666][30];
int dp[333];
int main()  
{  
#ifdef CDZSC_June
	freopen("t.txt", "r", stdin);  
#endif  
	int n,m,p,min1,p1;
	while(~scanf("%d%d",&n,&m))
	{
		scanf("%s",s1+1);
		for(int i = 0; i<n; i++)
		{
			scanf("%s",s2[i]);
		}
		dp[0] = 0;
		for(int i =1; i<=m; i++)
		{
			min1 = inf;
			for(int j =0; j<n; j++)
			{
				int len = strlen(s2[j]);
				p = len-1;
				if(len <= i){
					for(int k = i;k>=1;k--){
						if(s1[k] == s2[j][p]){
							p--;
							if(p == -1){
								p1 = k;
								break;
							}
						}
					}
				}
				if(p == -1){
					min1 = min(min1,(i-p1)-len+1+dp[p1-1]);
				}
			}
			dp[i] = min(dp[i-1]+1,min1);
		}
		printf("%d\n",dp[m]);
	}
	return 0;  
}  


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