1. 程式人生 > 實用技巧 >基於redis實現分散式鎖 php

基於redis實現分散式鎖 php

題目連結:https://codeforc.es/contest/1398/problem/D

題意:給3種集合 每種集合有 n對棍子 每次取任意兩個集合的一對棍子構成矩形, 矩形的面積為貢獻值, 問如何使得貢獻值最大

思路: 模擬一下發現貪心不對 那麼只能考慮dp了 (時間複雜度上也有暗示) 考慮狀態轉移的時候 自己考慮的是 讓三個數t1 t2 t3 o n 的++ 來處理 這樣顯然是不能包含所有的狀態的

dp 的時候最好處理完整個空間 不然很容易遺漏 dp[i][j][x] 表示 第一組取i個數 第二組取j個數 第三組取x個數的最大值

o(n^3) 寫法才能包含所有的狀態 然後就考慮每個狀態 可以 由 前3箇中的任意一個轉移過來 分別是 i-1 j-1 x i-1 j x-1 i j-1 x-1

然後發現一定是偶數,那麼把奇數排除掉, 再把一個組裡面 自己構成對的去掉 如 1 0 3 即可 還有一個貪心就是 取的數首先肯定是取得大的

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define pb push_back
 6 //#define double long double
 7 const int maxn=2e5+10;
 8 const int mod=998244353;
 9 int r1[maxn],g1[maxn],b1[maxn];
10 ll dp[205][205][205]; 11 12 13 14 int main() 15 { 16 ios::sync_with_stdio(false); 17 cin.tie(0); 18 int r,g,b; 19 cin>>r>>g>>b; 20 for(int i=1;i<=r;i++) 21 { 22 cin>>r1[i]; 23 } 24 for(int i=1;i<=g;i++) 25 { 26 cin>>g1[i];
27 } 28 for(int i=1;i<=b;i++) 29 { 30 cin>>b1[i]; 31 } 32 sort(r1+1,r1+1+r,greater<int>()); 33 sort(g1+1,g1+1+g,greater<int>()); 34 sort(b1+1,b1+1+b,greater<int>()); 35 ll ans=0; 36 for(int i=0;i<=r;i++) 37 { 38 for(int j=0;j<=g;j++) 39 { 40 for(int x=0;x<=b;x++) 41 { 42 if((i+j+x)%2||(i+j<x)||(i+x<j)||(x+j)<i) 43 continue; 44 45 int u=i-1,v=j-1,w=x-1; 46 if(u+v>=x) 47 dp[i][j][x]=max(dp[u][v][x]+r1[i]*g1[j],dp[i][j][x]); 48 if(u+w>=j) 49 dp[i][j][x]=max(dp[u][j][w]+r1[i]*b1[x],dp[i][j][x]); 50 if(v+w>=i) 51 dp[i][j][x]=max(dp[i][v][w]+g1[j]*b1[x],dp[i][j][x]); 52 ans=max(ans,dp[i][j][x]); 53 } 54 } 55 } 56 cout<<ans<<'\n'; 57 58 }
View Code