L1004加分二叉树

 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

所以还是加上那句话吧。。。

猜你喜欢

转载自www.cnblogs.com/Fo0o0ol/p/11101923.html