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;
}

 

  

 

posted @ 2020-08-16 00:53  coastal_taipan  阅读(165)  评论(0编辑  收藏  举报