关于滚动和不滚动的问题
查看原帖
关于滚动和不滚动的问题
787031
UKE_Piu楼主2025/6/18 18:26

我的dp方程推出来和题解一样的。不滚动答案错,滚动答案对了

不滚动

不是空间问题,就是答案不对。

不滚动code:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=1e3+5,M=205,P=1e9+7;
string A,B;
int dp[N][M][M][2];
int main(){
	cin>>n>>m>>k;
	cin>>A>>B;
	A=" "+A; B=" "+B;
	dp[0][0][0][0]=dp[1][0][0][0]=1;
	
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++)
	    for(int p=1;p<=k;p++){
	    	int t=(A[i]==B[j]?1:0);
	    	dp[i][j][p][0] = (dp[i-1][j][p][1]+dp[i-1][j][p][0])%P;
	    	dp[i][j][p][1] = (dp[i-1][j-1][p][1] + (dp[i-1][j-1][p-1][0]+dp[i-1][j-1][p-1][1])%P )%P;
	    	dp[i][j][p][1]*=t;
		}
	
	cout<<(dp[n][m][k][0]+dp[n][m][k][1])%P;
	return 0;
}

滚动code 100pts:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=1e3+5,M=205,P=1e9+7;
string A,B;
int dp[2][M][M][2];
int main(){
	cin>>n>>m>>k;
	cin>>A>>B;
	A=" "+A; B=" "+B;
	int id=1;
	dp[0][0][0][0]=dp[1][0][0][0]=1;
	
	for(int i=1;i<=n;i++,id^=1)
	  for(int j=1;j<=m;j++)
	    for(int p=1;p<=k;p++){
	    	int t=(A[i]==B[j]?1:0);
	    	dp[id][j][p][0] = (dp[id^1][j][p][1]+dp[id^1][j][p][0])%P;
	    	dp[id][j][p][1] = (dp[id^1][j-1][p][1] + (dp[id^1][j-1][p-1][0]+dp[id^1][j-1][p-1][1])%P )%P;
	    	dp[id][j][p][1]*=t;
		}
	
	cout<<(dp[n&1][m][k][0]+dp[n&1][m][k][1])%P;
	return 0;
}

求解!

2025/6/18 18:26
加载中...