背景

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根柱子的高度之和。

样例1

样例输入1[复制]

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

样例输出1[复制]

 
24

限制

各个测试点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 积木游戏的更多相关文章

  1. vijos 1464 积木游戏 DP

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

  2. 动态规划(水题):COGS 261. [NOI1997] 积木游戏

    261. [NOI1997] 积木游戏 ★★   输入文件:buildinggame.in   输出文件:buildinggame.out   简单对比时间限制:1 s   内存限制:128 MB S ...

  3. [NOI1997] 积木游戏

    COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★   输入文件:buildinggame ...

  4. [NOI1997] 积木游戏(dp)

    COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★   输入文件:buildinggame ...

  5. NOI 97 (Vijos 1464)积木游戏(DP)

    很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度.方程很容易推出. # include <cstdio> # include <cstring&g ...

  6. 【NOIP 2012 国王游戏】 贪心+高精度

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

  7. NOIp 2011 mayan游戏 搜索

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  8. [NOIp 2011]Mayan游戏

    Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...

  9. [NOIp 2012]国王游戏

    Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国 ...

随机推荐

  1. js展开更多

    var introduces = { inIt : function(){ introduces.imgLoad(); introduces.showMore(0,'hioh',86); introd ...

  2. zepto源码学习-06 touch

    先上菜,看这个模块的最后一段代码,一看就明白. ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 't ...

  3. Fiddler对安卓应用手机抓包图文教程

    http://www.cr173.com/html/37625_1.html 做开发需要抓取手机app的http/https的数据包,想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得 ...

  4. 如何用 Retrofit 2 在安卓上实现 HTTP 访问?

    最近,笔者对安卓开发的兴趣愈发浓厚,而且不断尝试了许多传闻很棒的开发库 -- 大部分也真的很不错.于是打算写一个系列文章,介绍使用这些让人惊叹的库建立安卓示例应用的实践.这样,读者可以自行判断,这些库 ...

  5. apk签名《转》

    出处!:http://jeff-pluto-1874.iteye.com/blog/847366 我觉得写的不错就转载了. 一.Android Apk签名Apk签名首先要有一个keystore的签名用 ...

  6. IDEA 整合Junit实现自动生成测试代码

    1.安装插件 junit generator 重启IDEA,完成安装. 2. 选中需要测试的方法,按alt + insert 即可自动生成测试类\方法 3. 设置

  7. UVA 11090 Going in Cycle!!

    要求给定的图的中平均权值最小的环,注意处理自环的情况就能过了. 按照w1+w2+w3+….wn < n*ave的不等式,也就是(w1-ave) + (w2-ave) +…..(wn-ave) & ...

  8. cocos-html5 Json 灵活 遍历方式 不同方式的缺陷,优点总结

    1,四种解析Json的方式:Part 1 var list1 = [1,3,4]; alert(list1[1]); var list2 = [{"name":"leam ...

  9. LCD 和 LED 的区别?

    http://sxlecd.blog.163.com/blog/static/131722380200911810564930/

  10. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...