破环成链、区间 DP,WA (40pts)
查看原帖
破环成链、区间 DP,WA (40pts)
480060
saihaze楼主2024/3/28 16:18

代码如下,其中 f 表示 [l,r] 合并的最大值,g 表示最小值:

#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;

int a[201], f[201][201], g[201][201];

int main() {
  memset(g, 0x3f, sizeof(g));
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    a[i + n] = a[i];
  }
  for (int i = 1; i <= 2 * n; i++) {
    a[i] += a[i - 1];
    g[i][i] = 0;
  }
  for (int len = 2; len <= n; len++) {
    for (int left = 1; left <= n; left++) {
      int right = left + len - 1;
      for (int mid = left; mid < right; mid++) {
        f[left][right] =
            std::max(f[left][right],
                     a[right] - a[left - 1] + f[left][mid] + f[mid + 1][right]);
        g[left][right] =
            std::min(g[left][right],
                     a[right] - a[left - 1] + g[left][mid] + g[mid + 1][right]);
      }
    }
  }
  int ans1 = 0, ans2 = 0x3f3f3f3f;
  for (int i = 1; i <= n; i++) {
    ans1 = std::max(ans1, f[i][i + n - 1]);
    ans2 = std::min(ans2, g[i][i + n - 1]);
  }
  cout << ans2 << '\n' << ans1 << '\n';
}

这应该是比较符合题意的做法,但测试点二、三、四答案错误。其中测试点二正确答案为 2087 10554,我的代码得到 2087 10544。

2024/3/28 16:18
加载中...