描述: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]; }