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