链接:

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 0xfffffffstruct 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=1;while(scanf("%d", &n), n){int i, j, k=0, x, y, z;for(i=1; 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=0; i<k; i++)///和最长单调递增子序列相似
        {int Max = 0;for(j=0; 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 = 0;for(i=0; i<k; i++)ans = max(ans, a[i].h);printf("Case %d: maximum height = %d\n", K++, ans);}return 0;
}

代码2:

/*
HDU1069Monkey and Banana
题目:给出一些长方体,然后让你把他堆成塔,
要求下面的塔的要比上面的塔大(长和宽),
而且每一种长方体的数量都是无限的。此题目考察到动态规划里的最长有序子序列,*/
#include<stdio.h>
#include<algorithm>
const int MAXN=200;
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 1;else if(a.x==b.x&&a.y<b.y)  return 1;else return 0;
}
int main()
{int n,i,x,y,z,j,k;int iCase=0;while(scanf("%d",&n),n){iCase++;k=0;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=0;for(i=1;i<k;i++){for(j=0;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 0;
}

转载于:https://www.cnblogs.com/YY56/p/4731198.html

(动态规划 最长有序子序列)Monkey and Banana --HDU --1069相关推荐

  1. 动态规划训练15 [Monkey and Banana HDU - 1069 ]

    Monkey and Banana HDU - 1069 题意大致是将一个长方体通过旋转,使得摞起来的建筑最高.但是必须满足这么一个条件,那就是上面的长方体的底面一定要完全被下一个长方体的底面完全覆盖 ...

  2. [kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069

    C - Monkey and Banana HDU - 1069 题目链接:https://vjudge.net/contest/68966#problem/C 题目: A group of rese ...

  3. Monkey and Banana HDU - 1069 [ 结构体排序+DP最长不上升子序列 ] 详细题解

    题解目录 1.题目 2.题意 3.思路 4.代码 1.题目 A group of researchers are designing an experiment to test the IQ of a ...

  4. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  5. 动态规划—最长上升子序列(POJ 1458)

    摘要 本文主要介绍了 经典算法题 最长上升子序列的动态规划解法,同时用北大OJ的案例来补充说明,意在学习动态规划的基本思想和解题过程,供大家一起学习! 什么是最长上升子序列? 最长上升子序列(Long ...

  6. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  7. 动态规划1--最长公共子序列

    动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...

  8. 动态规划——最长上升子序列问题(LIS)

    动态规划--最长上升子序列问题(LIS) 最长上升子序列问题(LIS).给定n个整数A1,A2,-,AnA_1, A_2, \dots , A_n,按从左到右的顺序选出尽量多的整数,组成一个上升子序列 ...

  9. 包信封问题 以及 最长有序子序列问题

    https://leetcode.com/problems/russian-doll-envelopes/?tab=Description 包信封问题,可以转化成最长有序子序列问题,见下面的分析: h ...

最新文章

  1. C++复制控制:拷贝构造函数
  2. [置顶]       Javascript js中页面的重新加载
  3. wireshark数据包分析实战
  4. python怎么输出文字_python怎么输出汉字
  5. java实现数字(摘要)签名,生成签名文件,防止文件被人篡改内容,分析和实现
  6. POE交换机隐藏指标是什么?
  7. 王爽 汇编语言第三版 课程设计 1
  8. Springboot-Flowable 快速开发工作流
  9. 平面最近点对问题(分治)
  10. win10下安装多个cuda(cuda9.0和10.0),并自由切换版本
  11. Python、Lua和Ruby——脚本大P.K.
  12. Screen Space Reflection 2
  13. 最新正版nero7序列号注册码
  14. 苹果手机怎么打开压缩文件_wx无法打开压缩文件的2种解决方法(以苹果手机为例)...
  15. send函数和recv函数
  16. 05 ,花瓣数据集:下载数据,特征分析图 pairplot
  17. vue element upload组件 file-list的动态绑定
  18. Telnet 发邮件
  19. 花开不败(作者:职烨)
  20. 2021年国网计算机考试难吗,2021想要通过国家电网招聘考试到底有多难?

热门文章

  1. python找第二大的数索引_python – 在numpy数组中查找多个值的行索引
  2. arm 基于qcamera实现_面向HPC和笔记本市场 ARM发Cortex A78C增强版
  3. LookupError: unknown encoding: utf-8
  4. 滚动图片广告_女排赢球可喜看台马桶广告扎眼 网友:去男足赛场!别在这儿蹭热点...
  5. 计算机硬件技术基础 统计字符串strl中字符'a'的个数,汕头大学工学院830计算机基础综合历年考研真题202p.doc...
  6. 服务器低功耗cpu性能,节能省电家庭共享 7款低功耗处理器推荐
  7. 【爬虫剑谱】二卷2章 实战篇-精美动漫图片爬取并保存
  8. stopped状态的进程 top 命令_Linux 进程管理之四大名捕
  9. 第二章 ---- spring注解开发
  10. javaSE----继承