POJ 3267 The Cow Lexicon(DP)

题目链接:http://poj.org/problem?id=3267

dp[i]表示从i到L所需要删除的最小字符数

如果不匹配:dp[i]=dp[i+1]+1;

如果匹配:dp[i]=min(dp[i],dp[pm]+(pm-i)-len);

len为匹配的字符串的长度,pm为从i开始匹配字符串结束的下标,(pm-i)-len即为所需要删除的字符数

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=305;
int w,L;
char msg[maxn];
char dic[605][35];
int dp[maxn];

int main(){
#ifndef ONLINE_JUDGE
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
#endif
    while(~scanf("%d%d",&w,&L)){
    	scanf("%s",msg);
    	for(int i=0;i<w;i++)
    		scanf("%s",dic[i]);
    	dp[L]=0;
    	for(int i=L-1;i>=0;i--){
    		dp[i]=dp[i+1]+1;
    		for(int j=0;j<w;j++){
    			int len=strlen(dic[j]);
    			if(len<=L-i&&msg[i]==dic[j][0]){
    				int pm=i;
    				int pd=0;
    				while(pm<=L){
    					if(msg[pm++]==dic[j][pd])
    						pd++;
    					if(pd==len){
    						dp[i]=min(dp[i],dp[pm]+(pm-i)-len);
    						break;
    					}
    				}
    			}
    		}
    	}
    	printf("%d\n",dp[0]);
    }
	return 0;
}


你可能感兴趣的:(POJ 3267 The Cow Lexicon(DP))