D. Colored Rectangles
题意
给出R对红木棒G对绿木棒B对蓝木棒 (R,G,B<200)
每对木棒有不同的长度
要求用不同颜色的两对木棒构造出矩形
求所有矩形的总面积最大是多少
题解
首先每次拿两对木棒肯定是所属颜色集合中最长的两队
所以sort降序排列
贪心取三个最大的其中两个优先组成矩形 表面上很合理但是是错误的
比如:
R :4 ,1
G:3, 3
B:4, 1
最大的值为4×3+4×3+1×1 而不是4×4+3×1+3×1 比较反直觉
正解是 设计一个三维dp(i,j,k)表示取前i对红的j对绿的k对蓝的所得到的最大值
本人太懒了 甚至不想复制 详解参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <bits/stdc++.h> using namespace std; typedef long long ll; #define endl '\n' #define Turnoff std::ios::sync_with_stdio(false) const ll Max=200+5; const double Pi=acos(-1);
ll red[Max],green[Max],blue[Max]; ll dp[Max][Max][Max]; int main(){ Turnoff; ll ans=0; int R,G,B;cin>>R>>G>>B; for(int i=1;i<=R;i++)cin>>red[i]; for(int i=1;i<=G;i++)cin>>green[i]; for(int i=1;i<=B;i++)cin>>blue[i]; sort(red+1,red+R+1,greater<ll>()); sort(green+1,green+G+1,greater<ll>()); sort(blue+1,blue+B+1,greater<ll>()); for(int i=0;i<=R;i++){ for(int j=0;j<=G;j++){ for(int k=0;k<=B;k++){ if(i&&j&&k){ dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]+red[i]*green[j]); dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k-1]+blue[k]*green[j]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]+red[i]*blue[k]); } else if(i&&j){ dp[i][j][k]=dp[i-1][j-1][k]+red[i]*green[j]; } else if(i&&k){ dp[i][j][k]=dp[i-1][j][k-1]+red[i]*blue[k]; } else if(j&&k){ dp[i][j][k]=dp[i][j-1][k-1]+blue[k]*green[j]; } ans=max(ans,dp[i][j][k]); } } } cout<<ans<<endl; }
|