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
Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case 4: maximum height = 342
题意:
给定N组数据,每组数据包含3个整数,分别代表长方体的长L、宽W、高H,将这N组数据叠起来,下面长方体的L和W必须比上面的大,
求最高可以叠多高。
每组测试数据的有不同的L、W、H,比如:10 20 30
L W H
10 20 30
20 30 10
10 30 20
(按L<W 排的)
(有这三种情况,其实总共6种,另外三种(L>W)和这重复)
思路:先将所有的数据存放到node[]中,对其大到小排序,
然后就可以使用DP了。
代码:(WA,不知为什么)
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1001];
static int Case=1;
struct Node
{
int L,W,H;
}node[1000];
bool cmp(Node a,Node b)
{
if(a.L==b.L)
{
return a.W>b.W;
}
return a.L>b.L;
}
int DP(int m)
{
for(int i=0;i<m;i++)
{
dp[i]=node[i].H;
for(int j=0;j<i;j++)
{
if(node[j].L>node[i].L&&node[j].W>node[i].W)
dp[i]=max(dp[i],dp[j]+node[i].H);
}
}
return dp[m-1];
}
int main()
{
freopen("C:\\Users\\liuzhen\\Desktop\\11.txt","r",stdin);
int n;
while(cin>>n)
{
if(n==0)
break;
int m=0;
for(int i=0;i<n;i++)
{
int l,w,h;
cin>>l>>w>>h;
if(l>w)
{
node[m].L=l;
node[m].W=w;
}
else
{
node[m].L=w;
node[m].W=l;
}
node[m++].H=h;
if(l>h)
{
node[m].L=l;
node[m].W=h;
}
else
{
node[m].L=h;
node[m].W=l;
}
node[m++].H=w;
if(h>w)
{
node[m].L=h;
node[m].W=w;
}
else
{
node[m].L=w;
node[m].W=h;
}
node[m++].H=l;
}
sort(node,node+m,cmp);
cout<<"Case "<<Case++<<": maximum height = "<<DP(m)<<endl;
}
freopen("con","r",stdin);
system("pause");
return 0;
}