数据范围只有200,所以我们可以用
的暴力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;
}