(动态规划 最长有序子序列)Monkey and Banana --HDU --1069
链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1069
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/E
代码:
///此题目考察到动态规划里的最长有序子序列 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define N 200
#define INF 0xfffffff struct node {int x, y, z, h, s;} a[N]; int cmp(node n1, node n2)
{
return n1.s < n2.s;
} int main()
{
int n, K=; while(scanf("%d", &n), n)
{
int i, j, k=, x, y, z;
for(i=; i<=n; i++)
{
scanf("%d%d%d", &x, &y, &z);
a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
swap(x, z);
a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
swap(y, z);
a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
} sort(a, a+k, cmp); for(i=; i<k; i++)///和最长单调递增子序列相似
{
int Max = ;
for(j=; j<i; j++)
{
if(((a[i].x>a[j].y && a[i].y>a[j].x) || (a[i].x>a[j].x && a[i].y>a[j].y)) && a[j].h>Max)
{
Max = a[j].h;
}
}
a[i].h = a[i].z + Max;
} int ans = ;
for(i=; i<k; i++)
ans = max(ans, a[i].h); printf("Case %d: maximum height = %d\n", K++, ans);
}
return ;
}
代码2:
/*
HDU1069Monkey and Banana
题目:给出一些长方体,然后让你把他堆成塔,
要求下面的塔的要比上面的塔大(长和宽),
而且每一种长方体的数量都是无限的。 此题目考察到动态规划里的最长有序子序列, */
#include<stdio.h>
#include<algorithm>
const int MAXN=;
using namespace std;
struct Block
{
int x,y,high;
int dp;//该箱子在最下面时的最大高度
}b[MAXN]; bool cmp(Block a,Block b)//用sort函数排序,先按x后按y升序
{
if(a.x<b.x) return ;
else if(a.x==b.x&&a.y<b.y) return ;
else return ;
}
int main()
{
int n,i,x,y,z,j,k;
int iCase=;
while(scanf("%d",&n),n)
{
iCase++;
k=;
while(n--)
{
scanf("%d%d%d",&x,&y,&z);
//把给出的block放置的所有可能放进block[]中,这样就可以解决有无限块的问题
if(x==y)
{
if(y==z)//三个相等,放一个就够了
{
b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
}
else //x==y!=z时三种放法
{
b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=z;b[k].y=y;b[k].high=x;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
}
}
else
{
if(y==z)//三种放法
{
b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
}
else if(x==z)
{
b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=x;b[k].y=z;b[k].high=y;b[k].dp=b[k].high;k++;
}
else//三个不等6种放法
{
b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
b[k].x=x;b[k].y=z;b[k].high=y;b[k].dp=b[k].high;k++;
b[k].x=z;b[k].y=x;b[k].high=y;b[k].dp=b[k].high;k++;
b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
b[k].x=z;b[k].y=y;b[k].high=x;b[k].dp=b[k].high;k++;
}
}
}
sort(b,b+k,cmp);
int maxh=;
for(i=;i<k;i++)
{
for(j=;j<i;j++)
if(b[i].x>b[j].x&&b[i].y>b[j].y)
b[i].dp=max(b[j].dp+b[i].high,b[i].dp);
if(b[i].dp>maxh)maxh=b[i].dp;
}
printf("Case %d: maximum height = %d\n",iCase,maxh);
}
return ;
}
(动态规划 最长有序子序列)Monkey and Banana --HDU --1069的更多相关文章
- (最大上升子序列)Monkey and Banana -- hdu -- 1069
http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit:1000MS Memory L ...
- Monkey and Banana HDU - 1069 有点像背包,又像最长上升序列
#include<iostream> #include<algorithm> #include<cstring> #include<vector> us ...
- Day9 - F - Monkey and Banana HDU - 1069
一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉. ...
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...
- 动态规划---最长上升子序列问题(O(nlogn),O(n^2))
LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) . ******* ...
- 动态规划——最长上升子序列LIS及模板
LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...
- 动态规划 - 最长公共子序列(LCS)
最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
随机推荐
- Scrapy简单入门及实例讲解-转载
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
- docker registry2
https://blog.csdn.net/mideagroup/article/details/52052618
- chm 文件生成器
1.看云:官网 https://www.kancloud.cn/price 价格如下:
- RN中关于ListView的使用
1. ListView dataSource 介绍: ListView需要指定数据的来源.传入数据必须是数组,或者是字典里面嵌套数组 系统会根据你传入的数据自动生成section和row 每一个字典的 ...
- springboot 面向切面
@Aspect @Configuration public class AspectTest { @Pointcut("execution(public String xxx.xxx.xxx ...
- Interface, 接口的实现初解
百度是这么说的: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 两种含 ...
- INI
.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理 ...
- 如何进入/home/user/.wine
命令行输入 :cd /home/user/.wine/drive_c/windows/fonts /home是linux的用户目录,/user是用户名/.wine是隐藏目录,凡是以.开头的都是隐藏目录 ...
- async与await
在方法上可以加 async,方法体内需要有 await,没有await的话,会出现warn警告.async单独出现是没有用的. await只能出现在Task前面.await Task的后面的代码会被封 ...
- vue2.0 tab切换几种方式
第一种 比较灵活简单的方式(切换改变部分的内容在组件中比较方便操作) <template> <div id="app"> <ul> <li ...