poj 3267 The Cow Lexicon

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

int min(int a,int b)
{
    return a<b?a:b;
}

int main()
{
   int W,L;
   while(~scanf("%d%d%*c",&W,&L))
   {
       int* dp=new int[L+1];
        char* mesg=new char[L];
        string* dict=new string[W];
        cin>>mesg;
        for(int i=0;i<W;i++)
            cin>>dict[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=dict[j].length();
           if(len<=L-i&&dict[j][0]==mesg[i])
           {
               int pm=i;//pm是给出字符的当前位置
               int pd=0;//字典中字符的位置
               while(pm<L)
               {
                   if(dict[j][pd]==mesg[pm++])//每次不管怎样给出的字符pm都加1
                    pd++;
                   if(pd==len)//如果字典中有字符被包含在字符串里面
                   {
                       dp[i]=min(dp[i],dp[pm]+pm-i-len);//dp公式pm-i-len 是i~pm中错误的个数
                       break;
                   }
               }
           }
       }
   }
     cout<<dp[0]<<endl;
   }

        return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值