D. Maximum Sum of Products
题目传送门
dp[i][j] 表示 从i翻转到j的和
n方DP 因为可以O1转移状态
只要从小到大枚举翻转区间长度就可, 比如 翻转1~5的区间 那么因为从小到大枚举的所以 2~4之前就被算出来了 只需要计算 1 5交换后的值是多少就可以了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5010;
int a[N],b[N];
int dp[N][N];
int n;
signed main()
{
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++) cin >> b[i];
int sum = 0;
for(int i = 1; i <= n; i ++) sum += a[i] * b[i];
for(int i = 1; i <= n; i ++) dp[i][i] = sum;
int res = sum;
for(int len = 2; len <= n; len ++){
for(int i = 1, j = i + len - 1 ; i + len - 1 <= n && j <= n; i ++,j ++){
if(j - i == 1) dp[i][j] = sum + a[i] * b[j] + a[j] * b[i] - a[i]*b[i] - a[j]*b[j];
else dp[i][j] = dp[i + 1][j - 1] + a[i] * b[j] + a[j] * b[i]- a[i]*b[i] - a[j]*b[j];
// cout << i << " " << j <<endl;
res = max(res,dp[i][j]);
}
}
cout << res << endl;
}

浙公网安备 33010602011771号