cf1398D---贪心+dp
题目链接:https://codeforces.com/contest/1398/problem/D
简单题意:给定一些不同长度三色的木棒,每种有R G B对,可以选两种不同颜色的木棒对组成一个长方形,求能组成的长方形总和的最大值
赛时没细想这题然后提前划水了。其实看到R G B<=200的数据范围应该可以想到dp的。设f[i][j][k]表示三色的木棒分别选了i j k对,能组成的长方形面积和的最大值。转移方程不难,见代码吧。另外这题有一个贪心的结论,要提前把长度排序,和排序不等式的原理类似。脑补一下就是dp转移的时候,要让小的和小的匹配,大的和大的匹配,这样能保证总面积最大
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=200+10; int R,G,B,i,j,k,r[maxn],g[maxn],b[maxn]; int f[maxn][maxn][maxn]; int main(){ std::ios::sync_with_stdio(false); cin>>R>>G>>B; for (i=1;i<=R;i++) cin>>r[i]; for (i=1;i<=G;i++) cin>>g[i]; for (i=1;i<=B;i++) cin>>b[i]; sort(r+1,r+R+1); sort(g+1,g+G+1); sort(b+1,b+B+1); //* for (i=0;i<=R;i++) for (j=0;j<=G;j++) for (k=0;k<=B;k++){ if (i>0&&j>0) f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k]+r[i]*g[j]); if (j>0&&k>0) f[i][j][k]=max(f[i][j][k],f[i][j-1][k-1]+g[j]*b[k]); if (i>0&&k>0) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+r[i]*b[k]); } cout<<f[R][G][B]<<endl; return 0; }