题目:https://www.luogu.org/problemnew/show/P2679#sub
此题很容易看出是dp题
公式想一想(想了很久)就出来了。。。
然后就是滚动数组。。。
注意!!!
1,从普通数组改成滚动数组必须注意那些靠初始值0来赋值的地方在滚动数组一定要重新赋值!!!(滚动数组的当前值不一定是0,而是前两行的值)
2,看题,看题,看题。重要的事情说三遍!!!
题目要mod1000000007!!!
3,dp题目若没有特殊要求第一次可以试着i、j、k依次循环
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int value=1000000007;
char a[1000+5],b[200+5];
int m,n,k1;
long long f[2][200+5][200+5],g[2][200+5][200+5];
//滚动数组,f不包含i,g包含i
void dp()
{
int i,j,k,i1,i2,temp;
i1=0; i2=1;
for (i=0;i<m;i++)
{
temp=i1; i1=i2; i2=temp;
for (j=0;j<=min(i,n-1);j++)
{
for (k=1;k<=j+1;k++)
{
if (k==1 && j==0)
{
if (a[i]==b[j])
{
g[i2][j][1]=1;
if (i>=1)
f[i2][j][1]=f[i1][j][1]+1;
else
f[i2][j][1]=1;
}
else
{
g[i2][j][1]=0;
f[i2][j][1]=f[i1][j][1];
}
}
else if (a[i]==b[j])
{
g[i2][j][k]=(g[i1][j-1][k]+f[i1][j-1][k-1])%value;
f[i2][j][k]=(f[i1][j][k]+g[i2][j][k])%value;
}
else
{
g[i2][j][k]=0;
f[i2][j][k]=f[i1][j][k];
}
}
}
}
printf("%lld\n",f[i2][n-1][k1]%value);
}
int main()
{
int i;
freopen("a.txt","r",stdin);
scanf("%d%d%d",&m,&n,&k1);
scanf("%s%s",&a,&b);
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
dp();
return 0;
}