D - Colored Rectangles(动态规划)
程序员文章站
2022-06-03 18:28:56
...
给出红绿蓝三种颜色的木棍,每种长度的木棍每一次给一对,现在每次取两对木棍,组成由两种颜色组成的长方形,求最后长方形的面积之和最大是多少
这样思路就很简单了,每次都从三个数组中挑选出最大的和次大的,模拟即可
但是你会发现,当有一种颜色的木棍数量很多时,假设 R > B+G
最优的策略还会是这样吗?
有可能存在 B G 两种颜色相互组成木棍,而我们希望让所有的 B G 都与 R 组成木棍
这两种决策需要再次比较大小,这样问题的复杂性就比较高了
WA代码:
const int N=1e5+5;
int n,m,t;
int i,j,k;
int a[N];
int b[N];
int c[N];
int main()
{
//IOS;
while(cin>>n>>m>>t){
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=m;i++) cin>>b[i];
for(i=1;i<=t;i++) cin>>c[i];
sort(a+1,a+1+n,greater<int>());
sort(b+1,b+1+m,greater<int>());
sort(c+1,c+1+t,greater<int>());
int pa=1,pb=1,pc=1;
ll ans=0;
while(true){
if(pa>n && pb>m) break;
if(pa>n && pc>t) break;
if(pb>m && pc>t) break;
vector<int> v;
v.pb(a[pa]);
v.pb(b[pb]);
v.pb(c[pc]);
sort(v.begin(),v.end());
ans+=1ll*v[2]*v[1];
if(v[1]==a[pa] && v[2]==b[pb]) pa++,pb++;
else if(v[1]==a[pa] && v[2]==c[pc]) pa++,pc++;
else if(v[1]==b[pb] && v[2]==a[pa]) pb++,pa++;
else if(v[1]==b[pb] && v[2]==c[pc]) pb++,pc++;
else if(v[1]==c[pc] && v[2]==a[pa]) pc++,pa++;
else if(v[1]==c[pc] && v[2]==b[pb]) pc++,pb++;
}
pll(ans);
}
//PAUSE;
return 0;
}
AC代码:
const int N=200+5;
int n,m,t;
int i,j,k;
int a[N];
int b[N];
int c[N];
int dp[N][N][N];
int main()
{
IOS;
while(cin>>n>>m>>t){
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=m;i++) cin>>b[i];
for(i=1;i<=t;i++) cin>>c[i];
sort(a+1,a+1+n,greater<int>());
sort(b+1,b+1+m,greater<int>());
sort(c+1,c+1+t,greater<int>());
int ans=0;
for(i=0;i<=n;i++){
for(j=0;j<=m;j++){
for(k=0;k<=t;k++){
dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+a[i+1]*b[j+1]);
dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]+a[i+1]*c[k+1]);
dp[i][j+1][k+1]=max(dp[i][j+1][k+1],dp[i][j][k]+b[j+1]*c[k+1]);
ans=max(ans,dp[i+1][j+1][k]);
ans=max(ans,dp[i+1][j][k+1]);
ans=max(ans,dp[i][j+1][k+1]);
}
}
}
cout<<ans<<endl;
}
//PAUSE;
return 0;
}
上一篇: 斐波拉契查找法的原理及实现
推荐阅读
-
D. Rarity and New Dress(思维+动态规划)Codeforces Round #662 (Div. 2)
-
Codeforces 1398 D. Colored Rectangles(dp)
-
D - Colored Rectangles(动态规划)
-
(动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积
-
D. Colored Rectangles(动态规划问题) Educational Codeforces Round 93 (Rated for Div. 2)
-
D. Rarity and New Dress(思维+动态规划)Codeforces Round #662 (Div. 2)