VJ - dp - Monkey and Banana - 最长单调序列

https://vjudge.net/contest/353156#problem/A

一开始想着按背包做 = =

我的dp还是太菜了

应该按照单调序列做

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5 struct node{
 6     int l;
 7     int s;
 8     int v;
 9     int ans;
10     node(){
11         ans = 0;
12     }
13 };
14 inline node newone(int a,int b,int c){
15     node New;
16     New.l = max(a,b);
17     New.s = min(a,b);
18     New.v = c;
19     New.ans = New.v;
20     return New;
21 }
22 void init(vector<node>& vec,int n){
23     int a,b,c;
24     for(int i = 0; i < n; i++){
25         cin >> a >> b >> c;
26         vec.push_back(newone(a,b,c));
27         vec.push_back(newone(a,c,b));
28         vec.push_back(newone(c,b,a));
29     }
30 }
31
32 bool comp(const node&a,const node&b){
33     if(a.l != b.l)return a.l > b.l;
34     else return a.s > b.s;
35 }
36 int main(){
37     int cnt = 1;
38     int n;
39     while(cin >> n && n){
40         vector<node> vec;
41         init(vec,n);
42         sort(vec.begin(),vec.end(),comp);
43         int s = 3 * n - 1;
44         for(int i = s-1; i >= 0; i--){
45             for(int j = i+1; j <= s; j++){
46                 if(vec[i].l > vec[j].l && vec[i].s > vec[j].s)
47                     vec[i].ans = max(vec[i].ans,vec[j].ans + vec[i].v);
48             }
49         }
50
51         int ans = 0;
52         for(int i = 0; i <= s; i++)
53             ans = max(ans,vec[i].ans);
54         cout<<"Case "<<cnt++<<": maximum height = "<<ans<<endl;
55     }
56     return 0;
57 }

原文地址:https://www.cnblogs.com/popodynasty/p/12235705.html

时间: 2024-10-11 23:16:14

VJ - dp - Monkey and Banana - 最长单调序列的相关文章

hdu 1069 (DP) Monkey and Banana

题目:这里 题意: Description 一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉. 研究人员有n种类型的砖块,每种类型的砖块都有无限个.第i块砖块的长宽高分别用xi,yi,zi来表示. 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高. 在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的

最长单调子序列(O(n^2) 和 O(nlg(n))))

给出一个数n,然后给出n个数,求n个数的最长单调子序列.如: n = 7 7    1     5    2    9    3    6 方法一:DP dp[i] 表示元素值不超过i时的最长单调序列.时间复杂度为O(n^2)则可以这样: #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100000 int a[N]; int dp[N]; int main() { //freop

HDOJ 1069 Monkey and Banana 【DP】

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8610 Accepted Submission(s): 4452 Problem Description A group of researchers are designing an experiment to test the IQ of a monke

HDU 1069 Monkey and Banana(DP 长方体堆放问题)

Monkey and Banana Problem Description A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever

HDU 1069 Monkey and Banana 基础DP

题目链接:Monkey and Banana 大意:给出n种箱子的长宽高.每种不限个数.可以堆叠.询问可以达到的最高高度是多少. 要求两个箱子堆叠的时候叠加的面.上面的面的两维长度都严格小于下面的. 简单的DP,依然有很多地发给当时没想到.比如优先级,比如这么简单粗暴的选择. 1 /* 2 大意是.给出n种箱子的长宽高.每种不限个数.可以堆叠.询问可以达到的最高高度是多少. 3 要求两个箱子堆叠的时候叠加的面.上面的面的两维长度都严格小于下面的. 4 5 样例: 6 10 20 30 7 10

HDU1069 Monkey and Banana 【DP】

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7816    Accepted Submission(s): 4028 Problem Description A group of researchers are designing an experiment to test the IQ of a

ACM-经典DP之Monkey and Banana——hdu1069

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6984    Accep

ZOJ1093 Monkey and Banana 【DP】

一.题目 ZOJ 1093 二.题目源程序 #include <stdio.h>//一个箱子有3种h..所以总共有3*n种高度.按面积从大到小排序 #include <stdlib.h> struct block { int x,y,z,h; }a[200]; int cmp(const void *a,const void *b)//快排,模版 { return ((struct block *)b)->x*((struct block *)b)->y - ((str

HDU 1069 Monkey and Banana dp 题解

HDU 1069 Monkey and Banana 题解 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种长方体,计算,最高能堆多高.要求位于上面的长方体的长要大于(注意不是大于等于)下面长方体的长,上面长方体的宽大于下面长方体的宽. 输入输出 开始一个数n,表示有多少种木块,木块的数量无限,然后接下来的n行,每行3个数,是木块的长宽高三个参量 输出使用这些在满足条件的情况下能够摆放的最大高度 解