1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rep(i, a, b) for (int i = a; i <= b; ++i) 4 const int N = 37; 5 6 int n, f[N][N], fa[N][N]; 7 8 inline int dfs(int L, int R) { if (L > R) return 1; 9 if (f[L][R]) return f[L][R]; 10 rep(i, L, R) { int k = dfs(L, i - 1) * dfs(i + 1, R) + f[i][i]; 11 if (k > f[L][R]) { 12 f[L][R] = k; fa[L][R] = i; 13 } 14 } 15 return f[L][R]; 16 } 17 18 void print(int L, int R) { if (L > R) return; 19 printf("%d ", fa[L][R]); print(L, fa[L][R] - 1); print(fa[L][R] + 1, R); 20 } 21 22 int main() { 23 scanf("%d", &n); 24 rep(i, 1, n) { 25 scanf("%d", &f[i][i]); fa[i][i] = i; 26 } 27 printf("%d\n", dfs(1, n)); print(1, n); 28 return 0; 29 }
为什么一定要写第九行的那句话呢
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rep(i, a, b) for (int i = a; i <= b; ++i) 4 const int N = 37; 5 6 int n, f[N][N], fa[N][N]; 7 8 inline int dfs(int L, int R) { if (L > R) return 1; 9 if (L == R) return f[L][R]; 10 // if (L == 1 && R == 1) cout << f[L][R] << '\n'; 11 // if (f[L][R]) return f[L][R]; 12 rep(i, L, R) { int k = dfs(L, i - 1) * dfs(i + 1, R) + f[i][i]; 13 if (k > f[L][R]) { 14 f[L][R] = k; fa[L][R] = i; 15 } 16 } 17 return f[L][R]; 18 } 19 20 void print(int L, int R) { if (L > R) return; 21 printf("%d ", fa[L][R]); print(L, fa[L][R] - 1); print(fa[L][R] + 1, R); 22 } 23 24 int main() { 25 scanf("%d", &n); 26 rep(i, 1, n) { 27 scanf("%d", &f[i][i]); fa[i][i] = i; 28 } 29 printf("%d\n", dfs(1, n)); print(1, n); 30 return 0; 31 }
如果第一段代码不写那句话的话
那么每次f[i][i]的值就会变化 导致结果的不正确
所以第二段代码的修改也是正确的
但是会因为没有记忆化而TLE
所以还是加上那句话吧。。。