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系列