【未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!】
【讨论加我QQ:1721324995 讨论加我QQ:1721324995 讨论加我QQ:1721324995 非诚勿扰!非诚勿扰!非诚勿扰!】
思路:
很明显的最长下降/上升子序列。
难不在于DP,而在于恶心的处理。因为长宽高可以条换,所以有6种可能。当然也可以说是3种,但是3种的处理比6种还麻烦,编程复杂度高。处理完这个,然后是排序。我习惯用最好写的选排,当然冒泡、插入都可以(我想没有人会为不到200的数据写快拍、归并或堆排吧)。我是按照长排序,长相等时在看高。排序完是初始化,初始化 f 数组,f[i]应为第i个长(正)方体的高(棱长)。
DP就是最长下降/上升子序列,我用的是最长下降子序列,因为排序我是从大到小的,反之则用最长上升子序列。注意,长宽都应大于(小于)另一长宽,不然就成最长不下降/不上升子序列了,结果自然不一样。
还有格式是个什么鬼,我因为少个空格被活生生地坑了一次WA(早知道直接复制题目的就好了)。。看来格式十分重要,在某刷题网站里,我的格式错误占总测试量的10%,所以——从今天起,一定要注意格式!一定要注意格式!一定要注意格式!
下面上AC代码:
uses math;
var
a:array[1..200,1..3]of longint;
f:array[1..200]of longint;
i,j,n,x,ans,t:longint;
begin
readln(n);
while n<>0 do begin
inc(x);ans:=0;
fillchar(a,sizeof(a),0);
//初始化
for i:=1 to n do begin
readln(a[i,1],a[i,2],a[i,3]);
a[n+i,1]:=a[i,1]; a[n+i,2]:=a[i,3]; a[n+i,3]:=a[i,2];
a[n*2+i,1]:=a[i,2]; a[n*2+i,2]:=a[i,1]; a[n*2+i,3]:=a[i,3];
a[n*3+i,1]:=a[i,2]; a[n*3+i,2]:=a[i,3]; a[n*3+i,3]:=a[i,1];
a[n*4+i,1]:=a[i,3]; a[n*4+i,2]:=a[i,1]; a[n*4+i,3]:=a[i,2];
a[n*5+i,1]:=a[i,3]; a[n*5+i,2]:=a[i,2]; a[n*5+i,3]:=a[i,1];
end;
//6种情况的处理
for i:=1 to 6*n-1 do
for j:=i+1 to 6*n do
if (a[i,1]<a[j,1])or(a[i,1]=a[j,1])and(a[i,3]<a[j,3]) then begin
t:=a[i,1];a[i,1]:=a[j,1];a[j,1]:=t;
t:=a[i,2];a[i,2]:=a[j,2];a[j,2]:=t;
t:=a[i,3];a[i,3]:=a[j,3];a[j,3]:=t;
end;
//选排
for i:=1 to 6*n do f[i]:=a[i,3];
for i:=2 to 6*n do begin
for j:=1 to i-1 do
if (a[i,1]<a[j,1])and(a[i,2]<a[j,2]) then f[i]:=max(f[i],f[j]+a[i,3]);
ans:=max(ans,f[i]);
end;
//DP,类似于最长下降子序列
writeln('Case ',x,': maximum height = ',ans);
readln(n);
end;
end.
【未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!】
【讨论加我QQ:1721324995 讨论加我QQ:1721324995 讨论加我QQ:1721324995 非诚勿扰!非诚勿扰!非诚勿扰!】