链接:

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的更多相关文章

  1. (最大上升子序列)Monkey and Banana -- hdu -- 1069

    http://acm.hdu.edu.cn/showproblem.php?pid=1069      Monkey and Banana Time Limit:1000MS     Memory L ...

  2. Monkey and Banana HDU - 1069 有点像背包,又像最长上升序列

    #include<iostream> #include<algorithm> #include<cstring> #include<vector> us ...

  3. Day9 - F - Monkey and Banana HDU - 1069

    一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉.   ...

  4. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  5. 动态规划---最长上升子序列问题(O(nlogn),O(n^2))

    LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) . ******* ...

  6. 动态规划——最长上升子序列LIS及模板

    LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...

  7. 动态规划 - 最长公共子序列(LCS)

    最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...

  8. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  9. nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)

    最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n).  具体分析参考:http://b ...

随机推荐

  1. 专业英语词汇(Java)

    abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]‘(n.入口, ...

  2. one by one 项目 part 2

    在网上百度了一下mySQL常用语句 ,整理如下: 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3. ...

  3. SQL Server 2008用'sa'登录失败,启用'sa'登录的办法

    首先”为什么用sa登录不了,提示登录失败呢?" 当然,自己装SQL Server 2008的时候根本就没有用sa登录的方法,装数据库的时候是用windows身份登录的. 如果要启用用户名为“ ...

  4. mark_2017_2_27

    工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...

  5. Process ProcessThread Thread

    Process ProcessThread: Process and ProcessThread objects have a ProcessorAffinity property of IntPtr ...

  6. WebDriverException:Element is not clickable at point - selenium执行过程中遇到的相关报错

    Element is not clickable at point (x, y) 这段可以忽略:本文来自 https://www.cnblogs.com/lozz/p/9947430.html 引起这 ...

  7. 二级联动的作业&左右移动作业

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [leetcode]112. Path Sum路径和(是否有路径)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  9. 对ubuntu初学感想

    感觉对ubuntu一头雾水...作为什么都不懂得小菜鸟,感觉以后还有很多要学习的.fighting

  10. ubuntu 安装 google Gtest

    1.安装源代码 在ubuntu的桌面上,右键选择打开终端,在终端中输入如下命令: $ sudo apt-get install libgtest-dev 下载源码后,apt将会在目录/usr/src/ ...