社区讨论

牢,悬棺

P2516[HAOI2010] 最长公共子序列参与者 5已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lzy3ylih
此快照首次捕获于
2024/08/17 20:22
2 年前
此快照最后确认于
2024/08/17 22:52
2 年前
查看原帖
不知因何神奇错误抱灵,求dalao帮助
CPP
#include<bits/stdc++.h>
#define int long long
#define la i&1^1
#define no i&1
#define mod 100000000
using namespace std;
int n,m,dp[2][5005],sum[2][5005];
string a,b;
signed main(){
	cin>>a>>b;n=a.size()-1,m=b.size()-1;a=' '+a,b=' '+b;
	for(int i=0;i<=m;i++) sum[0][i]=1;sum[1][0]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(a[i]==b[j]){
				dp[no][j]=dp[la][j-1]+1;
				sum[no][j]=dp[la][j-1]%mod;
				if(dp[no][j]==dp[la][j]) (sum[no][j]+=sum[la][j])%=mod;
				if(dp[no][j]==dp[no][j-1]) (sum[no][j]+=sum[no][j-1])%=mod;
			}
			else{
				dp[no][j]=max(dp[la][j],dp[no][j-1]);
				if(dp[la][j]>dp[no][j-1]) sum[no][j]=sum[la][j]%mod;
				else if(dp[la][j]<dp[no][j-1]) sum[no][j]=sum[no][j-1]%mod;
				else if(dp[no][j]!=dp[la][j-1]) sum[no][j]=(sum[no][j-1]+sum[la][j])%mod;
				else sum[no][j]=((sum[no][j-1]+sum[la][j]-sum[la][j-1])%mod+mod)%mod;
			}
		}
	cout<<dp[n&1][m]<<endl;
	cout<<sum[n&1][m]<<endl;
    return 0; 
}

回复

13 条回复,欢迎继续交流。

正在加载回复...