CF1398D Colored Rectangles (记忆化搜索DP)

在这里插入图片描述
数据范围只有200,所以我们可以用 O ( n 3 ) O(n^3) 的暴力DP

闫氏DP分析法用着是真的爽

在这里插入图片描述

#include<cstdio>
#include<algorithm>
#include<iostream>

using namespace std;

const int N = 207;
int f[N][N][N];
int n, m;
int a[N], b[N], c[N];


int dfs(int i, int j, int k){
    if(f[i][j][k])return f[i][j][k];
    if(i && j)f[i][j][k] = max(f[i][j][k], dfs(i - 1, j - 1, k) + a[i] * b[j]);
    if(i && k)f[i][j][k] = max(f[i][j][k], dfs(i - 1, j, k - 1) + a[i] * c[k]);
    if(j && k)f[i][j][k] = max(f[i][j][k], dfs(i, j - 1, k - 1) + b[j] * c[k]);
    return f[i][j][k];
}

int R, G, B;

int main(){
    scanf("%d%d%d", &R, & G, &B);
    for(int i = 1; i <= R; ++ i)scanf("%d", &a[i]);
    for(int i = 1; i <= G; ++ i)scanf("%d", &b[i]);
    for(int i = 1; i <= B; ++ i)scanf("%d", &c[i]);
    
    sort(a + 1, a + 1 + R);
    sort(b + 1, b + 1 + G);
    sort(c + 1, c + 1 + B);
    
    cout << dfs(R, G, B) << endl;
    return 0;
}

或者也可以写普通的DP

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define mem(i, a) memset(i, a, sizeof(i))
#define sqr(x) ((x)*(x))
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
typedef long long ll;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 2e2 + 7;
using namespace std;
ll dp[maxn][maxn][maxn];
int arr[3][maxn];
int main(void){
#ifdef ljxtt
freopen("data.in", "r", stdin);
#endif
    int num[3]; for(int i = 0; i < 3; i++) scanf("%d", &num[i]);
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < num[i]; j++)
            scanf("%d", &arr[i][j]);
        sort(arr[i], arr[i] + num[i], greater<int> ());
    }
    ll ans = 0;
    for(int i = 0; i <= num[0]; i++)
        for(int j = 0; j <= num[1]; j++)
            for(int k = 0; k <= num[2]; k++){
                dp[i + 1][j + 1][k] = max(dp[i + 1][j + 1][k], dp[i][j][k] + 1ll * arr[0][i] * arr[1][j]);
                dp[i + 1][j][k + 1] = max(dp[i + 1][j][k + 1], dp[i][j][k] + 1ll * arr[0][i] * arr[2][k]);
                dp[i][j + 1][k + 1] = max(dp[i][j + 1][k + 1], dp[i][j][k] + 1ll * arr[1][j] * arr[2][k]);
                ans = max(ans, dp[i][j][k]);
            }
    printf("%lld\n", ans);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_45697774/article/details/108449762