1. 程式人生 > 實用技巧 >Educational Codeforces Round 93 (Rated for Div. 2) D. Colored Rectangles

Educational Codeforces Round 93 (Rated for Div. 2) D. Colored Rectangles

D. Colored Rectangles

原題連結:

https://codeforces.ml/contest/1398/submission/89947207

題目大意:

有三種顏色的線條,紅色有R對,綠色有G對,黑色有B對,每次需要選擇兩種不同顏色的線條組成一個長方形,求組成的長方形最大面積和是多少。

解題思路:

選一種線條的時候,一定是從最長的開始,所以需要先排個序,然後開一個三維陣列,$dp_{i,j,k}$記錄選的三種顏色的情況,$i,j,k$都從小到大遍歷,然後求出$dp_{i,j,k}$有三種狀態推出的最大值(最多三種狀態)。

程式碼:

 1 #include <bits/stdc++.h>
 2
using namespace std; 3 typedef long long ll; 4 typedef pair<int,int> pi; 5 typedef complex <double> cp; 6 #define debug(a) cout<<#a<<":"<<a<<endl; 7 #define fr freopen("in.txt","r",stdin); 8 #define Fill(x,a) memset(x,a,sizeof(x)) 9 #define cpy(a,b) memcpy(a,b,sizeof(a)) 10
const double PI = acos(-1); 11 const int INF=0x3f3f3f3f; 12 const int N=1e6+7; 13 const int mod=1e9+7; 14 int maxn,minn; 15 int T,n,m,q; 16 int r[N],b[N],g[N]; 17 int nr,ng,nb; 18 int dp[205][205][205]; 19 int ans; 20 21 int main(){ 22 cin>>nr>>ng>>nb; 23 for(int i=1;i<=nr;i++){
24 scanf("%d",r+i); 25 } 26 for(int i=1;i<=ng;i++){ 27 scanf("%d",g+i); 28 } 29 for(int i=1;i<=nb;i++){ 30 scanf("%d",b+i); 31 } 32 sort(r+1,r+nr+1); 33 sort(g+1,g+ng+1); 34 sort(b+1,b+nb+1); 35 reverse(r+1,r+nr+1); 36 reverse(g+1,g+ng+1); 37 reverse(b+1,b+nb+1); 38 dp[0][0][0]=0; 39 for(int i=0;i<=nr;i++){ 40 for(int j=0;j<=ng;j++){ 41 for(int k=0;k<=nb;k++){ 42 if(i&&j){ 43 dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]+r[i]*g[j]); 44 } 45 if(i&&k){ 46 dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]+r[i]*b[k]); 47 } 48 if(k&&j){ 49 dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k-1]+g[j]*b[k]); 50 } 51 ans=max(ans,dp[i][j][k]); 52 } 53 } 54 } 55 cout<<ans<<endl; 56 57 58 59 return 0; 60 } 61