CF1519D 题解
思路
我们设 表示翻转 后和增加了几。 反转后变成了 ,而 翻转后成为了 ,我们发现,其中 翻转前后都是重复的,所以不用重复算那一段, 从 转移过来,。然后区间 dp 就从长度入手,先枚举长度再枚举左右端点转移即可。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n;
ll dp[5005][5005], a[5005], b[5005], sum, maxx;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n;
for (int i = 1; i <= n; ++ i)
cin >> a[i];
for (int i = 1; i <= n; ++ i)
cin >> b[i], sum += a[i] * b[i];
for (int len = 2; len <= n; ++ len)
for (int l = 1, r = len; r <= n; ++ l, ++ r)
maxx = max (maxx, dp[l][r] = dp[l + 1][r - 1] + a[l] * b[r] - a[l] * b[l] + a[r] * b[l] - a[r] * b[r]);
cout << maxx + sum;
return 0;
}

浙公网安备 33010602011771号