poj 3267(dp)

来源:互联网 发布:vb怎么随机生成数字 编辑:程序博客网 时间:2024/06/04 17:40

点击打开链接


题意:

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


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

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

#include"stdio.h"#include"string.h"#define N 302int 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;}


原创粉丝点击