[NOI1997] 积木游戏
COGS 261. [NOI1997] 积木游戏
http://www.cogs.pro/cogs/problem/problem.php?pid=261
★★ 输入文件:buildinggame.in
输出文件:buildinggame.out
简单对比
时间限制:1 s 内存限制:128 MB
SERCOI 最近设计了一种积木游戏。每个游戏者有N块编号依次为1 ,2,…,N的长方体积木。对于每块积木,它的三条不同的边分别称为”a边”、“b边”和”c边”,如下图所示:
游戏规则如下:
- 从N块积木中选出若干块,并将它们分成M(l<=M<=N) 堆,称为第1堆,第2 堆…,第M堆。每堆至少有1块积木,并且第K堆中任意一块积木的编号要大于第K+1堆中任意一块积木的编号(2<=K<=M)。
- 对于每一堆积木,游戏者要将它们垂直摞成一根柱子,并要求满足下面两个条件:
- 除最顶上的一块积木外,任意一块积木的上表面同且仅同另一块积木的下表面接触,并且要求下面的积木的上表面能包含上面的积木的下表面,也就是说,要求下面的积木的上表面的两对边的长度分别大于等于上面的积木的两对边的长度。
- 对于任意两块上下表面相接触的积木,下面的积木的编号要小于上面的积木的编号。
最后,根据每人所摞成的M根柱子的高度之和来决出胜负。
请你编一程序,寻找一种摞积木的方案,使得你所摞成的M根柱子的高度之和最大。
输入输出
输入文件的第一行有两个正整数N和M(1<=M<=N<=100),分别表示积木总数和要求 摞成的柱子数。这两个数之间用一个空格符隔开。接下来N行依次是编号从1到N的N个积木的尺寸,每行有三个1至1000之间的整数,分别表示该积木a 边,b边和c边的长度。同一行相邻两个数之间用一个空格符隔开。
输出文件只有一行,为一个整数,表示M根柱子的高度之和。
样例
输入文件
4 2
10 5 5
8 7 7
2 2 2
6 6 6
输出文件
24
f[k][i][j][l] 表示 前i个积木分为k组,第k组最后一个是j,j的摆放方式为l的最大高度
对于每一个积木有3种决策:
① 与前面积木合为一组 f[k][i][i][l]=max(f[k][i][j][t])+high[i]
② 自己另放一组 f[k][i][i][l]=max(f[k-1][i-1][j][t])+high[i]
③ 不放 f[k][i][j][l]=f[k][i-1][j][l]
其中0<=j<i 0<=t<=2 表示3种放置方式
ans=max(f[m][n][i][j]) 1<=i<=n,0<=j<=2
为了方便比较大小关系,我们可以先对输入每块积木的a,b,c排序,这样在DP中就不用判断同一块积木的长宽高
代码中的一些细节:
排序方式,每块积木最小的参数为a,中间的是b,最大的为c
状态表示方法:
0 表示 ab面为底;1 表示 ac面为底; 2表示bc面为底
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[],b[],c[],f[][][][];
int main()
{
/*freopen("buildinggame.in","r",stdin);
freopen("buildinggame.out","w",stdout);*/
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
if(a[i]>b[i]) swap(a[i],b[i]);
if(b[i]>c[i]) swap(b[i],c[i]);
if(a[i]>b[i]) swap(a[i],b[i]);
}
for(int k=;k<=m;k++)
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
for(int l=;l<=;l++)
{
int aa,bb,cc;
if(l==) aa=a[i],bb=b[i],cc=c[i];
else if(l==) aa=a[i],bb=c[i],cc=b[i];
else aa=b[i],bb=c[i],cc=a[i];
if(aa<=a[j]&&bb<=b[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-][j][]+cc);
if(aa<=a[j]&&bb<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-][j][]+cc);
if(aa<=b[j]&&bb<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-][j][]+cc);
f[k][i][i][l]=max(f[k][i][i][l],f[k-][i-][j][]+cc);
f[k][i][i][l]=max(f[k][i][i][l],f[k-][i-][j][]+cc);
f[k][i][i][l]=max(f[k][i][i][l],f[k-][i-][j][]+cc);
f[k][i][j][l]=f[k][i-][j][l];
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
ans=max(ans,f[m][n][i][j]);
printf("%d",ans);
}
2个错误:
1、j没有从0开始,从1开始,导致f[1][1][1][]的状态没有统计
2、转移中a,b,c交换错误,错误原因还没有找出
if(l==1) swap(b[i],c[i]);
else if(l==2) {swap(a[i],b[i]);swap(a[i],c[i]);}
if(a[i]<=a[j]&&b[i]<=b[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][0]+c[i]);
if(a[i]<=a[j]&&b[i]<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][1]+c[i]);
if(a[i]<=b[j]&&b[i]<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][2]+c[i]);
f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][0]+c[i]);
f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][1]+c[i]);
f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][2]+c[i]);
f[k][i][j][l]=f[k][i-1][j][l];
if(l==1) swap(b[i],c[i]);
else if(l==2) {swap(a[i],b[i]);swap(a[i],c[i]);}
错误代码
[NOI1997] 积木游戏的更多相关文章
- 动态规划(水题):COGS 261. [NOI1997] 积木游戏
261. [NOI1997] 积木游戏 ★★ 输入文件:buildinggame.in 输出文件:buildinggame.out 简单对比时间限制:1 s 内存限制:128 MB S ...
- [NOI1997] 积木游戏(dp)
COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★ 输入文件:buildinggame ...
- vijos 1464 NOIP 1997 积木游戏
背景 1997年全国青少年信息学(计算机)奥林匹克竞赛试题 第二试 描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,…,N的长方体积木.对于每块积木,它的三条 ...
- vijos 1464 积木游戏 DP
描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,…,N的长方体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边&qu ...
- NOI 97 (Vijos 1464)积木游戏(DP)
很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度.方程很容易推出. # include <cstdio> # include <cstring&g ...
- Java实现蓝桥杯 算法提高 盾神与积木游戏
题目描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋 ...
- noi 97 积木游戏
思路:黑书的例题 #include<map> #include<set> #include<cmath> #include<queue> #includ ...
- Unity3D独立游戏开发日记(二):摆放建筑物
在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
随机推荐
- 【搜索】POJ-2718 贪心+枚举
一.题目 Description Given a number of distinct decimal digits, you can form one integer by choosing a n ...
- Java 单生产者消费者问题
package com.cwcec.test; class Resource { private int count = 0; private boolean flag = false; public ...
- Scrum 项目7.0——第一个Sprint的演示和回顾
MY—HR 成员: 角色分配 学号 博客园 团队贡献分 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 21 郭明茵 用户 2014 ...
- Alpha阶段敏捷冲刺⑤
1.提供当天站立式会议照片一张. 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 新增了一个登录界面 完成记账的分类模块 报表界面初步设计 今天要完成 ...
- https 的理解
前言: 本篇博文来记录下对http及https的理解.(会有点 杂,补缺补漏) 引用:https://blog.csdn.net/u011109589/article/details/80306479 ...
- jQ 小球碰撞检测
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- Art & Material
Art(Android runtime)模式伴随Android 4.4发布.相对于Dalvik模式来说,Art模式改善了Android程序的性能. Material Design伴随Android 5 ...
- Install .Net Core For CentOS
Install .NET Core SDK Before you start, please remove any previous versions of .NET Core from your s ...
- get mobile http request in PC & fiddler4
get mobile http request in PC 如何在 pc 上抓取 手机的 http 请求 Fiddler 提琴手 https://www.telerik.com/download/fi ...
- 在sql server ide里数据修改数据
在sql server 的客户端工具ssms里,只有在工具里打开后直接修改. 除了用这种方法外,还有其它方法可以改吗?比如像pl/sql里的for update sql server的客户端功能比较差 ...