zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    FreePascal
    Delphi
    FreePascal
    FreePascal
    Linux
    FreePascal
    FreePascal
    CodeTyphon
    IDEA
    工作流科普——don't ask i don't know either
  • 原文地址:https://www.cnblogs.com/edmunds/p/13511257.html
Copyright © 2011-2022 走看看