b_lc_两个回文子序列长度的最大乘积(间隔 dfs / 状压)

找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 。两个子序列在原字符串中如果没有任何相同下标的字符,则它们是 不相交 的。n<10

思路:不相交,就直接在dfs的时候控制他们不能选同一个字符就行了

class Solution {
public:
    int ans;
    bool chk(string& s) {
        for (int i = 0; i < s.size() / 2; i++) {
            if (s[i] != s[s.size()-i-1]) {
                return false;
            }
        }
        return true;
    }
    void dfs(int i, string a, string b, string& s) {
        if (i >= s.size()) {
            if (chk(a) && chk(b)) {
                ans = max(ans, int(a.size() * b.size()));
            }
            return;
        }
        dfs(i+1, a+s[i], b, s);
        dfs(i+1, a, b, s);
        dfs(i+1, a, b+s[i], s);
    }
    int maxProduct(string s) {
        dfs(0, "", "", s);
        return ans;
    }
};

不过有点暴力...

class Solution {
public:
    int maxProduct(string s) {
        int tot = 1 << s.size();

        vector<pair<int, int>> A;
        for (int i = 1; i < tot; ++i) {
            string t;
            for (int j = 0; j < s.size(); ++j) {
                if (i & (1 << j)) {
                    t += s[j];
                }
            }
            string tt = t;
            reverse(tt.begin(), tt.end());
            if (t == tt)
                A.push_back({t.size(), i});
        }

        int ans = 0;
        for (int i = 0; i < A.size(); ++i) {
            for (int j = i + 1; j < A.size(); ++j) {
                if ((A[i].second & A[j].second) == 0) {
                    ans = max(ans, int(A[i].first * A[j].first));
                }
            }
        }
        return ans;
    }
};
posted @ 2021-09-12 12:16  童年の波鞋  阅读(41)  评论(0编辑  收藏  举报