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);
} 

 

posted @ 2020-08-19 13:10  zlc0405  阅读(169)  评论(0编辑  收藏  举报