做题记录整理dp5 P2679. [NOIP2015 提高组] 子串(2022/9/20)
dp是我的大弱项,所以很可能大部分的题都需要看题解来写,所以就可能很多时候就只是放一个感觉比较好的题解上来,不会像其他题一样自己分析
一个比较典的字符串dp
这个
#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int dp[2][205][205][2],n,m,k;
string a,b;
int maxn=1000000007;
int now,qian;
int main()
{
cin>>n>>m>>k;
cin>>a>>b;
a.insert(0," ");
b.insert(0," ");
dp[0][0][0][0]=1;
dp[1][0][0][0]=1;
for1(i,1,n)
for1(j,1,m)
for1(l,1,k)
{
if(a[i]==b[j])
{
dp[i%2][j][l][1]=(dp[(i-1)%2][j-1][l][1]+dp[(i-1)%2][j-1][l-1][0])%maxn+dp[(i-1)%2][j-1][l-1][1]%maxn;
dp[i%2][j][l][1]%=maxn;
dp[i%2][j][l][0]=dp[(i-1)%2][j][l][1]+dp[(i-1)%2][j][l][0];
dp[i%2][j][l][0]%=maxn;
}
else
{
dp[i%2][j][l][0]=dp[(i-1)%2][j][l][1]+dp[(i-1)%2][j][l][0];
dp[i%2][j][l][0]%=maxn;
dp[i%2][j][l][1]=0;
}
}
printf("%d",(dp[n%2][m][k][1]+dp[n%2][m][k][0])%maxn);
return 0;
}

浙公网安备 33010602011771号