vijos 1464 NOIP 1997 积木游戏
背景
1997年全国青少年信息学(计算机)奥林匹克竞赛试题
第二试
描述
积木游戏
SERCOI 最近设计了一种积木游戏。每个游戏者有N块编号依次为1 ,2,…,N的长方
体积木。对于每块积木,它的三条不同的边分别称为"a边"、"b边"和"c边"
游戏规则如下:
1、从N块积木中选出若干块,并将它们分成M(l<=M<=N) 堆,称为第1堆,第2 堆…,第M堆。每堆至少有1块积木,并且第K堆中任意一块积木的编号要大于第K+1堆中任意一块积木的编号(2<=K<=M)。
2.对于每一堆积木,游戏者要将它们垂直摞成一根柱子,并要求满足下面两个条件:
(1)除最顶上的一块积木外,任意一块积木的上表面同且仅同另一块积木的下表面接触,并且要求下面的积木的上表面能包含上面的积木的下表面,也就是说,要求下面的积木的上表面的两对边的长度分别大于等于上面的积木的两对边的长度。
(2)对于任意两块上下表面相接触的积木,下面的积木的编号要小于上面的积木的编号。
最后,根据每人所摞成的M根柱子的高度之和来决出胜负。
请你编一程序,寻找一种摞积木的方案,使得你所摞成的M根柱子的高度之和最大。
格式
输入格式
第一行有两个正整数N和M(1<=M<=N<=100),分别表
示积木总数和要求摞成的柱子数。这两个数之间用一个空格符隔开。接下来N行依次是编号
从1到N的N个积木的尺寸,每行有三个;至1000之间的整数,分别表示该积木a边,b边
和c边的长度。同一行相邻两个数之间用一个空格符隔开。
输出格式
只有一行,为一个整数,表示M根柱子的高度之和。
限制
各个测试点1s
提示
1997年全国青少年信息学(计算机)奥林匹克竞赛试题
第二试
大概就是个比较简单的dp,f[i][a][b][k],表示考虑到第i堆,第a个积木,上一个放的是b,且b的k面朝上。
然后转移的话是三种状态,丢掉,f[i][a+1][b][k],放到i堆顶上f[i][a+1][a][k'](这里要枚举个k’),
以及重新放到其它堆上f[i+1][a+1][a][k'](同样要枚举个k)。
#include <iostream>
#include <cstring>
#include <cstdio>
const int N = + ;
using namespace std ;
int n,m,f[N][N][N][],ans,inf;
struct Building
{
int h[],x[],y[];
} bks[N]; void Init()
{
scanf("%d%d",&n,&m);
int x,y,h;
for(int i = ;i <= n; ++i)
{
scanf("%d%d%d",&x,&y,&h);
bks[i].h[] = h;
bks[i].x[] = max(x,y), bks[i].y[] = min(x,y);
bks[i].h[] = x;
bks[i].x[] = max(h,y), bks[i].y[] = min(h,y);
bks[i].h[] = y;
bks[i].x[] = max(x,h), bks[i].y[] = min(x,h);
}
} int dp(int i,int a,int b,int k)
{
if(i>m||a>n)return ;
if(~f[i][a][b][k]) return f[i][a][b][k];
int ret = f[i][a][b][k] = ;
ret = dp(i,a+,b,k);//throw
for(int k2 = ; k2 < ; ++k2)
{
if(bks[b].x[k]>=bks[a].x[k2]&&bks[b].y[k]>=bks[a].y[k2])
ret = max(ret,dp(i,a+,a,k2)+bks[a].h[k2]);//top
if(i+<=m)
ret = max(ret,dp(i+,a+,a,k2)+bks[a].h[k2]);//new
}
f[i][a][b][k] = ret ;
return f[i][a][b][k] = ret;
} void Solve()
{
memset(f,-,sizeof(f));//inf = f[1][1][1][1];
bks[].x[] = bks[].y[] = ;
bks[].x[] = bks[].y[] = ;
bks[].x[] = bks[].y[] = ;
int ans = dp(,,,);
printf("%d\n",ans); } int main( )
{
// freopen("buildinggame.in","r",stdin);
// freopen("buildinggame.out","w",stdout);
Init();
Solve();
fclose(stdin);
fclose(stdout);
return ;
}
vijos 1464 NOIP 1997 积木游戏的更多相关文章
- vijos 1464 积木游戏 DP
描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,…,N的长方体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边&qu ...
- 动态规划(水题):COGS 261. [NOI1997] 积木游戏
261. [NOI1997] 积木游戏 ★★ 输入文件:buildinggame.in 输出文件:buildinggame.out 简单对比时间限制:1 s 内存限制:128 MB S ...
- [NOI1997] 积木游戏
COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★ 输入文件:buildinggame ...
- [NOI1997] 积木游戏(dp)
COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★ 输入文件:buildinggame ...
- NOI 97 (Vijos 1464)积木游戏(DP)
很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度.方程很容易推出. # include <cstdio> # include <cstring&g ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- NOIp 2011 mayan游戏 搜索
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- [NOIp 2011]Mayan游戏
Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...
- [NOIp 2012]国王游戏
Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国 ...
随机推荐
- Global中的事件执行顺序
The Global.asax file, sometimes called the ASP.NET application file, provides a way to respond to ap ...
- POJ 3159 Candies(差分约束)
http://poj.org/problem?id=3159 题意:有向图,第一行n是点数,m是边数,每一行有三个数,前两个是有向边的起点与终点,最后一个是权值,求从1到n的最短路径. 思路:这个题让 ...
- node.js + gulp用JENKINS作CI编译
这里还是有点坑,要注意. 安装NODE.JS不说,GULP绿色化也不说. 但要让JENKINS识别环境变量. /etc/profile.... export NODE_HOME=/usr/local/ ...
- 【HDOJ】1076 An Easy Task
水题,如题. #include <stdio.h> #define chk(Y) (Y%4==0 && Y%100!=0) || Y%400==0 int main() { ...
- ORA-12545:Connect failed beacuse target host or object does not exist
更换计算机名,重新启动系统后 oracle 的监听器就无法正常启动, 总是提示ORA-12545:Connect failed beacuse target host or object does n ...
- 设置将 Microsoft Azure 的网络基础结构以支持设置为灾难恢复站点
Prateek Sharma 云 + Enterprise 高级项目经理 Azure SiteRecovery (ASR)可以将Microsoft Azure用作您的虚拟机的灾难恢复站点. 当管理 ...
- 【转】 Xcode基本操作 -- 不错
原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...
- Ubuntu 12.04 和 Win7 双系统安装
Thinkpad T400上成功安装双系统 安装Win7 使用光盘按步骤安装,到这里是一个没有分区的硬盘,做了如下分区: 100M(系统保留),40G(C盘),60G(D盘),80G(E盘),52G( ...
- 【Android】Android部分问题记录
1.EditText不显示光标 开发的时候遇到有部分手机,小米系列以及华为部分手机不显示光标. 设置EditText属性 android:textCursorDrawable="@null& ...
- JAX-RS -- Java API for RESTful Web Services
Java EE 6 引入了对 JSR-311 的支持.JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可 ...