poj 3267(dp)

点击打开链接


题意:

给你一个字符串和几个单词,求这个字符串最少删去多少个字符,可以由这些单词组成。。


dp[i]=min(dp[i-1]+1,dp[k]+i-k-len[j])

k表示与第j个单词匹配到总串第k个字符。

#include"stdio.h"
#include"string.h"
#define N 302
int dp[N];
char str[N];
char word[N*2][N/10];
int len[N*2];
int min(int a,int b)
{
	return a<b?a:b;
}
int main()
{
	int n,m;
	int i,j;
	while(scanf("%d%d%s",&n,&m,str)!=-1)
	{
		getchar();
		for(i=0;i<n;i++)
		{
			gets(word[i]);
			len[i]=strlen(word[i]);
		}
		dp[0]=1;
		for(i=1;i<m;i++)
		{
			dp[i]=dp[i-1]+1;
			for(j=0;j<n;j++)
			{
				int k=i;
				int l=len[j]-1;
				if(i<l)continue;
				while(l>=0&&k>=0&&k>=l)
				{
					if(word[j][l]==str[k])l--;
					k--;
				}
				if(l<0)dp[i]=min(dp[i],dp[k]+i-k-len[j]);
			}
		}
		printf("%d\n",dp[m-1]);
	}
	return 0;
}


你可能感兴趣的:(dp,poj)