[DP] poj3267

/*
 这道题求的是某个字符串str,至少删去多少个字符后,剩下的字符串是由dict中的单词可以组成的。
 设f[i]=m,代表str[i...L-1]中至少删去m个字符后,剩下的字符串是由dict中的单词可以组成的。
 则问题求的就是f[0]。
 且可以得到递归式:
 f[L]=0;dp[i]=dp[i+1]+1
 如果存在单词可以匹配:f[i]=min(dp[i], dp[t+1]+(t-i+1)-m)
 且str[t-1]为可以匹配的字符串的最后一个字符,匹配的单词的长度为m。
 f[0]的最小值,即问题的最优化解。
*/
import java.util.*;
import java.math.*;
public class Main 
{
	static int MIN(int a,int b){return (a>b)? b:a;}
	static int MAX(int a,int b){return (a<b)? b:a;}
	static int Max_Int=200000000;
	static int compare(char a[],char b[],int j,int L)
	{
		int i=0;
		while(i<a.length && j<L)
		{
			if(a[i]==b[j])
			{
				i++;
				j++;
			}
			else j++;
		}
		if(i==a.length)
			return j-1; 
		return -1;
	}
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		int W,L;
		String SS;
		char str[]=new char [400];
		char s[][]=new char [610][28];
		int f[]=new int [610];
		while(cin.hasNextInt())
		{
			W=cin.nextInt();
			L=cin.nextInt();
			SS=cin.nextLine();
			SS=cin.nextLine();
			str=SS.toCharArray();
			for(int i=1;i<=W;i++)
			{
				SS=cin.nextLine();
				s[i]=SS.toCharArray();
			}
			f[L]=0;
			for(int i=L-1;i>=0;i--)
			{
				f[i]=f[i+1]+1;
				for(int j=1;j<=W;j++)
				{
					if(s[j][0]==str[i])
					{
						int v=compare(s[j],str,i,L);
						if(v!=-1)
						{
							f[i]=MIN(f[i], f[v+1]+v+1-i-s[j].length);
						}
					}
				}
			}
			System.out.println(f[0]);
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值