noip2001统计单词个数

最近,迷恋上DEBUG……

1.首先暴力一遍num[i][j]即从i到j串里包含多少个子串
(注意首字母的使用)
2.f[i][j]表示前i个数划分j次,最多单词个数
f[i][j]=max(f[i][j],f[k][j-1]+num[k+1][i];
!注意j,k范围

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
const int maxn=205,maxm=2005;
using namespace std;
template<typename T>inline void rd(T&x)
{
	char c;bool f=0;
	while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
	x=c^48;
	while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
	if(f)x=-x;
}

int p,cnt,k,n,vis[205];
char s[205],ss[7][205];
int f[205][205],num[205][205],len[7];
inline int vivi(int x,int y)
{
	int vv=0;
	inc(i,1,n)
	if(y-len[i]+1>=x&&!vis[y-len[i]+1])
	{
		int fl=0;
		for(int kk=1;kk<=len[i];++kk)
		if(s[y-len[i]+kk]!=ss[i][kk])fl=1;
		if(!fl)
		{
			vis[y-len[i]+1]=1;
			++vv;
		}
	}
	re vv;
}
inline void debug(int l)
{
	inc(i,1,l)
	{
		inc(j,1,l)
		printf("%d ",f[i][j]);
		printf("\n");
	}
}
int main()
{
	int x,y,T;
	freopen("in.txt","r",stdin);

	rd(p),rd(k);
	inc(i,1,p)
	scanf("%s",s+(i-1)*20+1);
	
	int length=strlen(s+1);
	rd(n);
	inc(i,1,n)
	{
		scanf("%s",ss[i]+1);
		len[i]=strlen(ss[i]+1);
	}
	inc(i,1,length)
	{
		inc(j,i,length)vis[j]=0;
		inc(j,i,length)
		{
			num[i][j]=num[i][j-1];
			num[i][j]+=vivi(i,j);
		}
	}
	inc(i,1,length)inc(j,1,min(k,i))inc(kk,j-1,i-1)
	f[i][j]=max(f[i][j],f[kk][j-1]+num[kk+1][i]);
//	debug(length);
	printf("%d",f[length][k]);
	
}

跟着ns学DP系列

posted @ 2019-08-01 17:51  凉如水  阅读(243)  评论(0编辑  收藏  举报