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;
    
}
posted @ 2021-05-10 15:28  和泉纱雾ovo  阅读(104)  评论(0)    收藏  举报