您的位置:首页 > 其它

Monkey and Banana(LIS最长上升子序列)

2015-08-14 20:30 405 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/B

题意:

有n种砖,每种砖有无数个,猴子要通过堆砖来吃到香蕉,下面的砖的长宽分别大于它上面的砖的长宽,问最多能有多高。

案例:

input

1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

output

Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
思路分析:
每种砖的高度有三种可能,每次的长都大于宽,然后按从大到小的顺序排列,但要记住还有相等的情况,这个时候就要按宽来排。
找出每块砖处于最上面时会有多高。最后找出最大高度。
源代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
int l,w,h;
}s[100];
bool cmp(const node a,const node b)
{
return a.l>b.l;
if(a.l==b.l) return a.w>b.w;
}
int main()
{
int n,t=0,m,maxn,a,b,c,dp[100],i,j;
while(scanf("%d",&n)&&n)
{
t++;
m=0;
maxn=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
s[m].l=max(a,b);s[m].w=min(a,b);s[m].h=c;m++;             //每种砖的三种可能性
s[m].l=max(a,c);s[m].w=min(a,c);s[m].h=b;m++;
s[m].l=max(c,b);s[m].w=min(c,b);s[m].h=a;m++;
}
sort(s,s+m,cmp);
for(i=0;i<m;i++)
{
dp[i]=s[i].h;
for(j=0;j<i;j++)
if((s[j].l>s[i].l&&s[j].w>s[i].w)&&dp[j]+s[i].h>dp[i])
dp[i]=dp[j]+s[i].h;                  //每种砖放在最顶上的最大高度
if(dp[i]>maxn) maxn=dp[i];
}
printf("Case %d: maximum height = %d\n",t,maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: