web-dev-qa-db-ja.com

2つの重複しない回文サブシーケンスの最大積を求めます

私はsおよびaと呼ぶ文字列bの2つの重複しないパリンドロームサブシーケンスの最大積を見つけようとしています。私は以下のコードを思いつきましたが、それは正しい出力を与えていません:

public static int max(String s) {
    int[][] dp = new int[s.length()][s.length()];

    for (int i = s.length() - 1; i >= 0; i--) {
        dp[i][i] = 1;
        for (int j = i+1; j < s.length(); j++) {
            if (s.charAt(i) == s.charAt(j)) {
                dp[i][j] = dp[i+1][j-1] + 2;
            } else {
                dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
            }
        }
    }
    return dp[0][s.length()-1];
}

入力文字列 "acdapmpomp"の場合、a = "aca"およびb = "pmpmp"を選択して、スコア3 * 5 = 15の最大積を取得できます。ただし、プログラムは次のように出力します。 5。

8
flash

最初に、ボトムアップアプローチを使用して最長の回文サブシーケンスの長さを見つけるためにdpテーブルをトラバースする必要があります。次に、dp [i] [j]とdp [j + 1] [n-1]を乗算して最大積を計算できます。以下に示すのはC++のコードです。

int longestPalindromicSubsequenceProduct(string x){
int n = x.size();
vector<vector<int>> dp(n,vector<int>(n,0));
for(int i=0;i<n;i++){
    dp[i][i] = 1;
}
for(int k=1;k<n;k++){
for(int i=0;i<n-k;i++){
        int j = i + k;
            if(x[i]==x[j]){
                dp[i][j] = 2 + dp[i+1][j-1];
            } else{
                dp[i][j] = max(dp[i][j-1],dp[i+1][j]);
            }
   }
}
int maxProd = 0;
for(int i=0;i<n;i++){
    for(int j=0;j<n-1;j++){
        maxProd = max(maxProd,dp[i][j]*dp[j+1][n-1]);
      }
   }
return maxProd;
}
2
Shubham Patel