1. 程式人生 > 實用技巧 >CF1398D Colored Rectangles(DP)

CF1398D Colored Rectangles(DP)

比賽的時候寫了好久貪心,現在才知道這題貪心不可做,前面的決策會對後面的決策產生影響。

#include<bits/stdc++.h>
using namespace std;
const int maxn=205;
int ans;
int dp[maxn][maxn][maxn];
int a[maxn];
int b[maxn];
int c[maxn];
bool cmp (int x,int y) {return x>y;}
int main () {
    int A,B,C;
    scanf("%d%d%d",&A,&B,&C);
    
for (int i=1;i<=A;i++) scanf("%d",a+i); for (int i=1;i<=B;i++) scanf("%d",b+i); for (int i=1;i<=C;i++) scanf("%d",c+i); sort(a+1,a+1+A,cmp); sort(b+1,b+1+B,cmp); sort(c+1,c+1+C,cmp); for (int i=0;i<=A;i++) for (int j=0;j<=B;j++) for (int k=0;k<=C;k++) {
if (i&&j) dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]+a[i]*b[j]); if (i&&k) dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]+a[i]*c[k]); if (j&&k) dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k-1]+b[j]*c[k]); ans=max(ans,dp[i][j][k]); } printf(
"%d\n",ans); }