1 solutions
-
0
Guest MOD
-
1
经典区间动态规划。 环不好解决,先断环为链,即把原数组复制一遍接在后面。 设 表示 到 区间的最大能力值,考虑转移。因为 到 这个区间一定是由两个小区间合并的到,所以我们按区间长度从小到大转移,对于每个大区间枚举中间点 ,两个小区间就是 到 和 到 , 那么这个大区间的能力值就等于两个小区间的能力值和加上两个区间合并得到的能力值,即 $ f_{l,r} = max(f_{l+1,k}+f_{k+1,r}{a_l} \bigoplus a_{k+1} \bigoplus a_r )$ 答案就是所有长度为 的区间最大能力值的最大值。
#include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' int n, H, ans, a[205], f[205][205]; void solve() { cin >> n >> H; for (int i = 1; i <= n; i ++ ) { cin >> a[i]; a[i + n]=a[i]; } for (int len = 2; len <= n * 2; len ++ ) for (int l = 1, r = l + len - 1; l + len - 1 <= n * 2; l ++, r ++ ) for (int k = l; k < r; k ++ ) f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + (a[l] ^ a[k+1] ^ a[r + 1])); for (int i = 1; i <= n; i ++ ) ans = max(ans, f[i][i + n - 1]); cout << H-ans; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); solve(); return 0; }
- 1
Information
- ID
- 1479
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- (None)
- # Submissions
- 41
- Accepted
- 15
- Uploaded By