经典水题.......

断环为链长度乘二,求前缀和区间DP。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define int long long
 5 const int N = 210;
 6 
 7 int f[N][N], sum[N];
 8 
 9 main() {
10     int n;
11     scanf("%lld", &n);
12     for(int i = 1; i <= n; i++) {
13         scanf("%lld", &sum[i]);
14         sum[n + i] = sum[i];
15     }
16     memset(f, 0x3f, sizeof(f));
17     for(int i = 1; i <= n << 1; i++) {
18         sum[i] += sum[i - 1];
19         f[i][i] = 0;
20     }
21 
22 
23     for(int len = 2; len <= n; len++) {
24         for(int l = 1; l + len - 1 <= n << 1; l++) {
25             int r = l + len - 1;
26             for(int k = l; k < r; k++) {
27                 f[l][r] = std::min(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);
28             }
29         }
30     }
31 
32     int ans = 0x3f3f3f3f3f3f3f3f;
33     for(int i = 1; i <= n; i++) {
34         ans = std::min(ans, f[i][i + n - 1]);
35     }
36     printf("%lld\n", ans);
37 
38     memset(f, 0, sizeof(f));
39     for(int len = 2; len <= n; len++) {
40         for(int l = 1; l + len - 1 <= n << 1; l++) {
41             int r = l + len - 1;
42             for(int k = l; k < r; k++) {
43                 f[l][r] = std::max(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);
44             }
45         }
46     }
47     ans = 0;
48     for(int i = 1; i <= n; i++) {
49         ans = std::max(ans, f[i][i + n - 1]);
50     }
51     printf("%lld", ans);
52     return 0;
53 }
AC代码

相关文章:

  • 2021-08-01
  • 2022-01-20
  • 2021-07-08
  • 2022-12-23
  • 2021-12-27
猜你喜欢
  • 2022-12-23
  • 2022-02-04
  • 2021-08-07
  • 2022-12-23
  • 2021-10-19
  • 2022-03-09
  • 2021-08-08
相关资源
相似解决方案