HDOJ1069 猴子和香蕉——输出的格式很重要_耀晨SYW

4 篇文章 0 订阅
4 篇文章 0 订阅

【未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!】

【讨论加我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  非诚勿扰!非诚勿扰!非诚勿扰!】


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值