·题目描述

一种积木游戏,游戏者有N块编号依次为1,2,…,N的长方体积木。第I块积木通过同一顶点三条边的长度分别为ai,bi,ci(i=1,2,…,N),如图1所示:

游戏规则如下:

1 从N块积木中选出若干块,并将他们摞成M(1<= M <= N)根柱子,编号依次为1,2,…,M,要求第k根柱子的任意一块积木的编号都必须大于第K-1根柱子任意一块积木的编号(2<=K<=M)。

2 对于每一根柱子,一定要满足下面三个条件:

除最顶上的一块积木外,任意一块积木的上表面同且仅同另一块积木的下表面接触;

对于任意两块上下表面相接触的积木,若m,n是下面一块积木接触面的两条边(m>=n),x,y是上面一块积木接触面的两条边(x>=y),则一定满足m.>=x和n>=y;

下面的积木的编号要小于上面的积木的编号。
请你编一程序,寻找一种游戏方案,使得所有能摞成的M根柱子的高度之和最大。

·输入格式

文件的第一行是两个正整数N和M(1<= M <= N <=100),分别表示积木总数和要求摞成的柱子数。这两个数之间用一个空格符隔开。接下来的N行是编号从1到N个积木的尺寸,每行有三个1至500之间的整数,分别表示该积木三条边的长度。同一行相邻两个数之间用一个空格符隔开。

·输出格式

文件只有一行,是一个整数,表示所求得的游戏方案中M根柱子的高度之和。

·样例输入

4 2
10 5 5
8 7 7
2 2 2
6 6 6

·样例输出

24

题解:

拿到这题,考虑了一下写记忆化搜索,dfs(int id,int bottom,int k),\(id\)表示当前考虑的积木,\(bottom\)表示该积木下的积木序号,\(k\)表示当前考虑第\(id\)块积木的第\(k\)面。感觉可以瞎搞搞,但是由于我太懒就没有继续想下去。。。(ε=ε=ε=┏(゜ロ゜;)┛逃)

后来看到这题出处,97年NOI的dp题,应该值得一写,于是重新思考了一下。

我们用\(f[i][j][k]\)表示当前在搭第i根柱子,考虑第\(j\)个积木的第\(k\)面。于是,每个积木都有\(3\)个决策,要么放在上一个积木的上面(有条件约束),要么去搭下一根柱子,要么不用它。所以,我们很容易就可以写出状态转移方程。

详情见代码。。。(,,ԾㅂԾ,,)

#include <stdio.h>
#include <string.h>
#include <iostream>
#define Re register int
using namespace std;int N,M,x1,y1,x2,y2,d[105][3],f[105][105][3],ans;inline int read()
{int x=0,w=0; char ch=0;while (!isdigit(ch)) w|=ch=='-',ch=getchar();while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return w?-x:x;
}
inline int max(int a,int b) {return a>b?a:b;}
int main(int argc, char const *argv[])
{N=read(); M=read();for (Re i=1; i<=N; ++i)d[i][0]=read(),d[i][1]=read(),d[i][2]=read();memset(f,0x80,sizeof(f));f[0][0][0]=f[0][0][1]=f[0][0][2]=0;for (Re i=1; i<=M; ++i)for (Re j=1; j<=N; ++j) //枚举要做决策的积木for (Re b=0; b<j; ++b) //枚举底部的积木,0表示没有(新搭一个柱子)for (Re bs=0; bs<3; ++bs) //枚举底部积木的面for (Re ns=0; ns<3; ++ns) //当前积木的面{x1=d[b][bs]; y1=d[b][(bs+1)%3];x2=d[j][ns]; y2=d[j][(ns+1)%3];if (x1>y1) swap(x1,y1);if (x2>y2) swap(x2,y2);if (x1>=x2&&y1>=y2)f[i][j][ns]=max(f[i][j][ns],f[i][b][bs]+d[j][(ns+2)%3]);f[i][j][ns]=max(f[i][j][ns],f[i-1][b][bs]+d[j][(ns+2)%3]);}for (Re i=1; i<=N; ++i)ans=max(ans,max(f[M][i][0],max(f[M][i][1],f[M][i][2])));printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Alkri/p/9533149.html

[NOI 1997] 积木游戏(dp)相关推荐

  1. vijos 1464 积木游戏 DP

    描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,-,N的长方 体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边&q ...

  2. #bzoj2240#积木游戏(DP? 贪心?)

    2240: 积木游戏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 小时候我们都喜欢玩积木.这里的积木都是单位边长的正方体块,多个积木可以堆成一个"高木",&quo ...

  3. c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】

    [导语]课件制作本身就是作者综合素养的一种体现,它显现出制作者对教育.教学.教材改革方向的把握,对课堂教学的理解,对现代教育技术的领悟.因此教师在设计课件时一定要吃透教学内容,设计出符合教学的方案用于 ...

  4. 计算机积木游戏,乐高积木模拟器

    乐高积木模拟器是一款非常好玩的休闲小游戏,超好玩的拼积木游戏玩法,玩家需要将一个个积分方块拼接在一起,看似简单的玩法实则充满着挑战性,非常考验玩家的耐心.充分发挥自己的想象力,在这个游戏世界中玩耍,加 ...

  5. 积木游戏 (Standard IO)

    题意/Description: 在一个N*N的区域玩积木游戏,每个单元格正好跟积木的底面相等,每个单元格里放有若干个积木,Alice想重新摆放积木,使得每个单元格最多只能放一个积木,并且所有积木正好形 ...

  6. 华为机试真题 Python 实现【相同数字的积木游戏】【2022.11 Q4 新题】

    目录 题目 思路 考点 Code 题目 题目描述 小华和小薇一起通过玩积木游戏学习数学. 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同. 小华随机拿一些积木挨着排成一排,请小薇找到 ...

  7. 算法提高 盾神与积木游戏

    算法提高 盾神与积木游戏   时间限制:1.0s   内存限制:256.0MB 问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们 ...

  8. 题目0171-相同数字的积木游戏1

    相同数字的积木游戏1 题目描述 小华和小薇一起通过玩积木游戏学习数学. 他们有很多积木,每个积木块上都有一个数字, 积木块上的数字可能相同. 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相 ...

  9. 基于egret引擎、P2物理库的搭积木游戏

    最近更新源代码: https://github.com/lixintong1992/egret_game 最近不务正业,参加了一个HTML5游戏设计比赛.速成了一个搭积木游戏. http://dev. ...

最新文章

  1. proDAD Erazr便携版
  2. Hive客户端secureCRT中文显示设置
  3. PHP数组的排序函数
  4. php jquery 弹窗提示框,jQuery实现消息弹出框效果
  5. VMware虚拟机安装Linux系统(详解版)
  6. 第二十六讲:tapestry的树状(tree)组件
  7. java c static,java-是否可以禁用静态最终变量的javac内联?
  8. mysql左联一对多_MySQL左连接多对一行
  9. js 中时间格式化的几种方法
  10. 基础XML配置的AOP与基于注解实现的AOP详细对比
  11. STC学习:可切换内容的电子音乐
  12. 解析大型.NET ERP系统 自动更新
  13. EXCEL VBA编程基础
  14. report machine实现报表分栏
  15. 如何查看手机上已连接 WIFI 的密码
  16. SSM服装管理系统毕业设计源码080948
  17. 捕鱼里金币掉落的效果
  18. 如何用uni-app做一个领优惠券H5、小程序商城(一)
  19. 时尚手表品牌PaulHewitt,手表手链超时尚品牌礼物
  20. 项目管理手记(七)--DRP系统的文化输出与营销 1

热门文章

  1. 每个程序员都该知道的五大定律
  2. Spring Boot集成支付宝电脑网站支付功能
  3. python-opencv图片合成视频
  4. java后端处理Apple Pay流程
  5. U盘保存文件未完成时拔掉U盘导致数据丢失的解决办法
  6. 公众号推文制作及发布保姆级教程
  7. libuv访问mysql_浅析libuv源码-编译启动
  8. 阿里巴巴离职DBA职业生涯总结--吕海波
  9. 网页三栏布局常用方法
  10. 书评《半小时漫画中国史》