做题记录整理dp4 P2516. [HAOI2010] 最长公共子序列(2022/9/20)
对于最长公共子序列是一个经典的字符串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;
}

浙公网安备 33010602011771号