做题记录整理dp5 P2679. [NOIP2015 提高组] 子串(2022/9/20)

P2679. [NOIP2015 提高组] 子串

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;
}
posted @ 2022-09-20 17:08  yyx525jia  阅读(18)  评论(0)    收藏  举报