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

261. [NOI1997] 积木游戏

★★   输入文件:buildinggame.in   输出文件:buildinggame.out   简单对比
时间限制:1 s   内存限制:128 MB

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个积木的尺寸,每行有三个1至1000之间的整数,分别表示该积木a 边,b边和c边的长度。同一行相邻两个数之间用一个空格符隔开。

输出文件只有一行,为一个整数,表示M根柱子的高度之和。

样例

输入文件

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

输出文件

24

  水DP。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxn=110;
 6 int a[maxn][3];
 7 int dp[maxn][maxn][3],n,m;
 8 int main(){
 9     freopen("buildinggame.in","r",stdin);
10     freopen("buildinggame.out","w",stdout);
11     scanf("%d%d",&n,&m);
12     for(int i=1;i<=n;i++)
13         scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
14     memset(dp,0x80,sizeof(dp));dp[0][0][0]=dp[0][0][1]=dp[0][0][2]=0;
15     for(int i=1;i<=m;i++)
16         for(int j=1;j<=n;j++)
17             for(int h=0;h<j;h++)
18                 for(int k=0;k<=2;k++)
19                     for(int l=0;l<=2;l++){
20                         int x1,y1,x2,y2;
21                         x1=a[h][k];
22                         y1=a[h][(k+1)%3];
23                         x2=a[j][l];
24                         y2=a[j][(l+1)%3];
25                         if(x1>y1)swap(x1,y1);
26                         if(x2>y2)swap(x2,y2);
27                         if(x1>=x2&&y1>=y2)
28                             dp[i][j][l]=max(dp[i][j][l],dp[i][h][k]+a[j][(l+2)%3]);
29                         dp[i][j][l]=max(dp[i][j][l],dp[i-1][h][k]+a[j][(l+2)%3]);
30                     }
31     int ans=0;
32     for(int i=1;i<=n;i++)
33         ans=max(ans,max(max(dp[m][i][0],dp[m][i][1]),dp[m][i][2]));
34     printf("%d\n",ans);
35     return 0;
36 }
				
时间: 2024-11-10 07:52:01

动态规划(水题):COGS 261. [NOI1997] 积木游戏的相关文章

【BZOJ1087】【SCOI2005】互不侵犯King 状态压缩 动态规划 水题 都不用加特技

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44022265"); } 题解: 一开始让我写这道题,其实我是,是接受的. BalaBala. 毕竟水题,都不用特技. 裸状压DP. 直接f[i][j][k]表示第i行状态时j,有k个落子时的方案数. 代码: #include <

[Usaco2008 Feb]Line连线游戏[暴力][水题]

Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i个点 的横.纵坐标分别为X_i和Y_i (-1,000 <= X_i <=1,000: -1,000 <= Y_i <= 1,000). 贝茜可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线 平行的直线.游戏结束时贝茜的得分,就是她画出的直线的总条数.为了在游戏 中胜出,

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

【ECNU71】一个游戏(水题)

点此看题面 大致题意: \(n\)种元素,有若干组将\(x\)元素转化为\(y\)元素的操作.问对于所有可能的元素拥有状况,改变转化操作的顺序,是否会影响转化后最终的结果. 水题 虽说是这么水的题,但毕竟还是模拟赛题,所以照例写一下题解吧... 首先,若对于两组转化操作\((a,b),(c,d)\),\(a,b,c,d\)各不相同,显然它们是互不影响的. 否则,我们分下面几类考虑: \((a,b),(a,c)\),显然,先\((a,b)\)则\(a\)会变成\(b\),先\((a,c)\)则\(

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

【BZOJ】3850: ZCC Loves Codefires(300T就这样献给了水题TAT)

http://www.lydsy.com/JudgeOnline/problem.php?id=3850 题意:类似国王游戏....无意义.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include &l

vijos 1464 积木游戏 DP

描述 积木游戏 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.对于每一堆积木,游戏者要

1503171912-ny-一道水题

一道水题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 今天LZQ在玩一种小游戏,可是这游戏数有一点点的大,他一个人玩的累.想多拉一些人进来帮帮他.你能写一个程序帮帮他吗?这个游戏是这种:有一行数字,假设我们把这行数字中的'5'都看成空格,那么就得到一行用空格切割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是由若干个'0'组成的,这时这个整数就是0). 你的任务是:对这些切割得到的整数,依从小到大的顺序排序输出,大家赶

HDU 5135 Little Zu Chongzhi&#39;s Triangles(简单水题)

题目链接: 戳我 题目大意: 给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍. 样例解释: 3 //三个棍子 1 1 20   // 每个棍子的长度,自然,这三个棍子不可能组成三角形,故输出 0.00 7          // 7个棍子 3 4 5 3 4 5 90 // 组成两个三角形(3, 3 4)和(4, 4, 5),面积和即为13.64 0   // 输出 0 退出 解题思路: 本来不想写题解的,因为太水了,,,,,,, 可是看到 谷歌搜出