我的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;
}
求解!