|
1 | | -class Solution { |
2 | | - int dp[1<<12]; |
| 1 | +class Solution { |
3 | 2 | unordered_map<int,int>memo; |
4 | 3 | public: |
5 | | - bool isPalin(string&s, int state) |
| 4 | + int lp(string&s, int state) |
6 | 5 | { |
7 | 6 | if (memo.find(state)!=memo.end()) |
8 | 7 | return memo[state]; |
9 | | - |
10 | | - vector<int>idx; |
11 | | - int n = s.size(); |
12 | | - for (int i=0; i<n; i++) |
| 8 | + |
| 9 | + string t; |
| 10 | + for (int i=0; i<s.size(); i++) |
13 | 11 | { |
14 | 12 | if ((state>>i)&1) |
15 | | - idx.push_back(n-1-i); |
| 13 | + t.push_back(s[s.size()-1-i]); |
16 | 14 | } |
17 | | - reverse(idx.begin(), idx.end()); |
18 | | - |
19 | | - int i=0, j=idx.size()-1; |
20 | | - while (i<j) |
21 | | - { |
22 | | - if (s[idx[i]]!=s[idx[j]]) |
| 15 | + |
| 16 | + int n = t.size(); |
| 17 | + vector<vector<int>>dp(n, vector<int>(n)); |
| 18 | + for (int i=0; i<n; i++) |
| 19 | + dp[i][i] = 1; |
| 20 | + for (int len=2; len<=n; len++) |
| 21 | + for (int i=0; i+len-1<n; i++) |
23 | 22 | { |
24 | | - memo[state]=0; |
25 | | - return false; |
26 | | - } |
27 | | - i++; |
28 | | - j--; |
29 | | - } |
30 | | - memo[state]=1; |
31 | | - return true; |
| 23 | + int j = i+len-1; |
| 24 | + if (t[i]==t[j]) |
| 25 | + dp[i][j] = dp[i+1][j-1]+2; |
| 26 | + else |
| 27 | + dp[i][j] = max(dp[i][j-1], dp[i+1][j]); |
| 28 | + } |
| 29 | + |
| 30 | + memo[state] = dp[0][n-1]; |
| 31 | + return dp[0][n-1]; |
32 | 32 | } |
33 | 33 |
|
34 | 34 |
|
35 | 35 | int maxProduct(string s) |
36 | 36 | { |
37 | 37 | int n = s.size(); |
38 | | - |
39 | | - for (int state=1; state<(1<<n); state++) |
40 | | - { |
41 | | - int t = __builtin_popcount(state); |
42 | | - if (isPalin(s, state)) |
43 | | - { |
44 | | - dp[state] = t; |
45 | | - continue; |
46 | | - } |
47 | | - for (int i=0; i<n; i++) |
48 | | - { |
49 | | - if ((state>>i)&1) |
50 | | - dp[state] = max(dp[state], dp[state-(1<<i)]); |
51 | | - } |
52 | | - } |
53 | | - |
54 | 38 | int all = (1<<n)-1; |
55 | 39 | int ret = 0; |
56 | | - for (int subset=1; subset<(1<<n); subset++) |
57 | | - ret = max(ret, dp[all-subset]*dp[subset]); |
58 | | - return ret; |
| 40 | + for (int subset=1; subset<(1<<n)-1; subset++) |
| 41 | + ret = max(ret, lp(s, all-subset)*lp(s, subset)); |
| 42 | + return ret; |
59 | 43 | } |
60 | 44 | }; |
0 commit comments