做题记录整理dp4 P2516. [HAOI2010] 最长公共子序列(2022/9/20)

P2516. [HAOI2010] 最长公共子序列

对于最长公共子序列是一个经典的字符串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 n,m;
int dp[2][5005];
int fa[2][5005];
char a[5005],b[5005];
const int mod=1e8;
int main() {
	scanf("%s",a+1);
	scanf("%s",b+1);
	
	n=strlen(a+1)-1;
	m=strlen(b+1)-1;
	
	int now=1,qian=0;
	
	for1(i,0,m)
	fa[0][i]=1;
	
	fa[1][0]=1;
	
	for1(i,1,n) {
		for1(j,1,m) {
			dp[now][j]=max(dp[qian][j],dp[now][j-1]);

			fa[now][j]=0;

			if(a[i]==b[j])
				dp[now][j]=max(dp[now][j],dp[qian][j-1]+1);

			if(a[i]==b[j]&&dp[now][j]==dp[qian][j-1]+1)
				fa[now][j]+=fa[qian][j-1];

			if(dp[qian][j]==dp[now][j])
				fa[now][j]+=fa[qian][j];

			if(dp[now][j-1]==dp[now][j])
				fa[now][j]+=fa[now][j-1];

			if(dp[qian][j-1]==dp[now][j])
				fa[now][j]-=fa[qian][j-1];

			fa[now][j]=(fa[now][j]+mod)%mod;
		}
		swap(now,qian);
	}
	printf("%d\n%d",dp[qian][m],fa[qian][m]);
	return 0;
}
posted @ 2022-09-20 16:06  yyx525jia  阅读(28)  评论(0)    收藏  举报