poj 3267 the cow lexicon

19 篇文章 1 订阅

戳这里原题

大致题意:给你w个单词和长度为l的字符串,问在字符串中删除多少个字符可以使其匹配到单词序列

嗯然后是dp。

开dp[i]记录在第i位及之前要删除多少字符,已知找到dp[i],初始状态dp【l】=0,然后从后往前扫输入的字符串。这个时候,dp方程有两种

dp【i】=dp【i+1】+1;(不能匹配)

dp【i】=min(dp【i】,dp[pm]+(pm-i)+len);

第一个方程不难理解,主要是第二个;
1. pm是对于输入字符串的指针,i是当前这个单词的首字母的位置,p每个单词的pm指的就是字符串中和单词最后一个字母相等的位置。(pm-i)就是这中间一共有多少个字符,(pm-i)+len就是这一段字母中需要删减多少字母
2. 关于怎么匹配,直接上代码喽!

cpp
#include<iostream>  
#include<cstdio>  
#include<cstring> 

using namespace std;  
char str[1000];  
char word[1000][30];  
int dp[1000];

int main()
{  
    int w,l,i,j,pos,k,temp;  
    scanf("%d%d",&w,&l); 
    scanf("%s",str);  
    for(i=0;i<w;i++)
    {  
        scanf("%s",word[i]);  
    }
    dp[l]=0;    
    for(i=l-1;i>=0;i--)
    {  
        dp[i]=dp[i+1]+1;  
        for(j=0;j<w;j++) 
        {  
            int len=strlen(word[j]); 
            if(len<=l-i && word[j][0]==str[i])  
            {
                int pm=i;  
                int pw=0;  
                while(pm<l) 
                {  
                    if(word[j][pw]==str[pm++])  
                       pw++;  
                    if(pw == len)  
                   {       
                     dp[i]=min(dp[i],dp[pm]+(pm-i)-len); 
                     break;                            
                   }                                     
                }  
            }  
        }  
    }
    printf("%d\n",dp[0]);    
    return 0;  
}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值