已解决

0
0

有眼睛锐利的帮看看问题好不?^_^ 做法还是普通的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]的值做判断,当它不小于阈值的时候才可以被判入内

  • 添加评论
  • reply

0 answer(s)

write answer 切换为英文 切换为中文


转发分享