P2432 zxbsmk爱查错

描述:https://www.luogu.com.cn/problem/P2432

 给你一个主串以及若干个子串,求最少需要删除几个字母,使得主串能由一些子串组成。


dp [ i ] 表示前 i 个字符最少要删掉几个。

那么我们枚举到了dp [ i ] 

最劣一定是继承前一个状态,删掉当前字母dp [ i ]=dp [ i-1 ] + 1

那么还可以以当前字符作为字串的第一个,暴力匹配。

用两个指针对比主串后面的字符和字串,匹配成功就可以转移。

#include <bits/stdc++.h>
using namespace std;
int n,m,dp[100009];
string a[1009];
int main()
{
    cin>>n>>m;
    string s;
    cin>>s;
    memset(dp,20,sizeof(dp));
    for(int i=1;i<=n;i++)    cin>>a[i];
    dp[0]=0;
    for(int i=1;i<=m;i++)
    {
        int t=i-1;
        dp[i]=min(dp[i],dp[i-1]+1);//直接删掉 
        for(int j=1;j<=n;j++)
        {
            if(s[t]!=a[j][0])    continue;
            int p1=t,p2=0,flag=0;
            while(p1<=m)
            {
                if(s[p1]==a[j][p2])    p1++,p2++;
                else    p1++;
                if(p2==a[j].length()){
                    flag=1;
                    break;
                }
            }
            if(flag)    dp[p1]=min(dp[p1],dp[i-1]+p1-t-p2);
        }
    }
    cout<<dp[m];
}
原文地址:https://www.cnblogs.com/iss-ue/p/12532298.html