ickchen2

PKU 3267

/*一道和LCS类似的题目,dp[i]表示前i个字符要删除的最小个数*/
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#define M 1000
using namespace std;
string s;
string t;
vector<string>din;
int dp[M];
void comp(int pos,int n)
{
    int r=0;
    int k;
    for(int i=pos;i<s.size();i++)
    {
        if(s[i]==din[n][r])
        {
            r++;
        }
        if(r>=din[n].size()){k=i;break;}
    }
    if(r>=din[n].size())
    {
        int p=k-pos+1;
        if(dp[pos]+k-pos+1-din[n].size()<dp[pos+p])
        {
            dp[pos+p]=dp[pos]+k-pos+1-din[n].size();
        }
    }
}
int main()
{
    freopen("3267.txt","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<=m;i++)
    {
        dp[i]=1<<30;
    }
    dp[0]=0;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        cin>>t;
        din.push_back(t);
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(din[j][0]==s[i])
            {
            if(i+din[j].size()<=m)
            comp(i,j);
            }
            if(dp[i]+1<dp[i+1])
            {
                dp[i+1]=dp[i]+1;
            }
        }
    }
    printf("%d\n",dp[m]);
}

posted on 2008-09-08 09:58 神之子 阅读(356) 评论(0)  编辑 收藏 引用 所属分类: ACM题解


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜