有眼睛锐利的帮看看问题好不?^_^ 做法还是普通的DP然后针对K值做处理 enter code here
char str1[2100], str2[2100];
vector > dp;
void printPairs();
const int K=3;
int main(){
scanf("%s",str1);
scanf("%s",str2);
int len1=strlen(str1);
int len2=strlen(str2);
dp=vector<vector<int> >(len1,vector<int>(len2,0));
for(int i=len1-1;i>=0;i--){
for(int j=len2-1;j>=0;j--){
if(str1[i]==str2[j]){
if(i+1<len1&&j+1<len2)
dp[i][j]=dp[i+1][j+1]+1;
else
dp[i][j]=1;
}
}
}
printVector();//测试使用
//printPairs();
printf("\n");
for(int i=len1-1;i>=0;i--){
for(int j=len2-1;j>=0;j--){
int temp=dp[i][j];
//如果i/j+dp[i][j]未超出范围,则将其修改更新
for(int k=1;k<=temp;k++){//从K到dp[i][j]可达的长度都要判断
if(i+k<len1&&j+k<len2){
dp[i][j]=max((k>=3?k:0)+dp[i+k][j+k],dp[i][j]);
}
else
break;
}
if (i + 1 < len1)
dp[i][j] = max(dp[i][j], dp[i + 1][j]);
if (j + 1 < len2)
dp[i][j] = max(dp[i][j], dp[i][j + 1]);
}
}
printVector();//测试使用
printf("%d",dp[0][0]);
return 0;
}
void printVector(){ int len1=dp.size(); int len2=dp[0].size(); for(int i=0;i
在我们更新数值的时候需要对dp[i+K][j+K]的值做判断,当它不小于阈值的时候才可以被判入内