• 周日. 11月 27th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

洛谷 P2432 zxbsmk爱查错 && 洛谷 P2875 [USACO07FEB]The Cow Lexicon S

admin

11月 28, 2021

题目传送门

题目传送门2

f[i]表示到第i位最少要删的字符数,对于每个i,将其作为最后一位向前跟w个单词匹配,如果向前匹配到第k位,那就用f[k-1]转移,在匹配过程中记录需要删去元素的个数.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>

using namespace std;

int w,l,f[700];
string p,cs,o[700];
map<string,bool> vis;

inline string pp(int a,int b) {
	string u;
	for(int i = a;i <= b; i++) {
		u += p[i];
	}
	return u;
}

int main() {
	scanf("%d%d",&w,&l);
	memset(f,0x3f3f3f,sizeof(f));
	cin >> p;
	for(int i = 1;i <= w; i++) {
		cin >> o[i];
		vis[o[i]] = 1;
	}
	f[0] = 0;
	for(int i = 1;i <= p.length(); i++) f[i] = i;
	for(int i = 1;i <= p.length(); i++)
		for(int j = 1;j <= w; j++) {
			int id = 0,d = o[j].length() - 1,sum = 0;
			for(int k = i;k >= 1; k--) {
				if(p[k-1] == o[j][d])
					d--,id = k;
				else
					sum++;
				if(d == -1) break;
			}
		if(d == -1) f[i] = min(f[i],f[id-1] + sum);
		}
	printf("%d",f[l]);
	
	return 0;
} 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注