题目地址
题目大意:给定两个字符串,任意选取他们的子串C,D。求出其中最大的 4⋅LCS(C,D)−|C|−|D|。
思路:n=5000,考虑n^2的状态转移。dp[i][j]为以第一个串以第i个字符结尾,第二个串以第j个字符结尾的子串的所能取到的最大值.
则转移分两种情况:
1.c[i]==d[j],则dp[i][j]=dp[i-1][j-1]+2;
2.c[i]!=d[j] 则dp[i][j]=max(dp[i][j-1],dp[i-1][j])-1;
其中dp[i][j]>=0;
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+9;
int dp[maxn][maxn];
char c[maxn],d[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",c+1);
scanf("%s",d+1);
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i]==d[j]){
dp[i][j]=dp[i-1][j-1]+2;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])-1;
if(dp[i][j]<0) dp[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=max(ans,dp[i][j]);
// printf("%d\n",dp[i][j]);
}
}
printf("%d\n",ans);
}