垒砖问题(转自Topcoder)

NiuGuy 2009-07-10 09:21:28
加精
问题:现有高度各不同的一堆砖,现要求将其垒成两个高度相同的台子

输入:int [] bricks(各砖高度)
输出:int(有方案则输出台子高度,没有则为-1)
例如:
{ 2, 3, 5 }
Returns: 5
{ 10, 9, 2 }
Returns: -1

下面是我找到的一位牛人的算法,但是看不懂

public class EqualTowers {

/**
* @param args the command line arguments
*/
private static final int MAX=250000;
private int[][] mem= new int[50][MAX+1];
private int[] bricks;

public int height(int[] bricks){
this.bricks=bricks;
return go(0,0);
}

public int go(int k,int t){
if(t>MAX){
return -1;
}
if(k==bricks.length)
{
return ((t==0)?0:-1);
}
if(mem[k][t]==0){
//add to the First tower
int d1=go(k+1,t+bricks[k]);
//do nothing;
int d2=go(k+1,t);
//add to the second tower
int d3=go(k+1,Math.abs(bricks[k]-t));
if(d3!=-1){
d3+=Math.min(t,bricks[k]);
}
//pick the best result
mem[k][t]=Math.max(d1,Math.max(d2, d3));
//Prevent a 0-size tower in the final result;
if(t==0&&k==0&&mem[k][t]==0){
mem[k][t]=-1;
}
mem[k][t]+=2;
}
return mem[k][t]-2;
}

public static void main(String[] args) {
// TODO code application logic here
}

}

欢迎讨论!
...全文
538 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
black_qq 2010-07-18
  • 打赏
  • 举报
回复
认真看看
zhufeiguanghui 2010-02-01
  • 打赏
  • 举报
回复
这是topcoder上的题,用DP解决
duzhongming 2009-12-11
  • 打赏
  • 举报
回复
up
Be_yond 2009-09-29
  • 打赏
  • 举报
回复
垒砖。。。dp+滑动数组,确实难想到
lstool 2009-07-15
  • 打赏
  • 举报
回复
学习了,呵呵,好好研究研究.
Jerrfy 2009-07-14
  • 打赏
  • 举报
回复
学习了,谢谢你,
xiaoyu821120 2009-07-14
  • 打赏
  • 举报
回复
没有特别的条件,这个是NP问题,解空间是2^n,不过注意数组是int型,那么解空间就是台子的高度/2了.
fire_woods 2009-07-14
  • 打赏
  • 举报
回复
首先,这个问题时间复杂度应该>=背包问题.

也就是说是个NP难问题.
cyrainfish 2009-07-14
  • 打赏
  • 举报
回复
NiuGuy 2009-07-14
  • 打赏
  • 举报
回复
请看12楼补充
lsd123 2009-07-14
  • 打赏
  • 举报
回复
.
zh7965 2009-07-14
  • 打赏
  • 举报
回复
首先加一下,和是奇数就肯定是-1啦。
然后设容量为一半,砖头从大到小往里塞,则必有刚好塞满的时候。
解决了。
zhengming99402 2009-07-14
  • 打赏
  • 举报
回复
sssssssssssvzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
java1109 2009-07-13
  • 打赏
  • 举报
回复
mark
有空了再看
unix229 2009-07-13
  • 打赏
  • 举报
回复
先mark后学
oo 2009-07-13
  • 打赏
  • 举报
回复
MARK
liuhao159753 2009-07-13
  • 打赏
  • 举报
回复
学习~~
绿色夹克衫 2009-07-13
  • 打赏
  • 举报
回复
还是背包问题,就是一个sum/2的背包,LZ给出的牛人的方法似乎是用状态压缩的动态规划解的,
应该是个不错的办法,不过不知道原题是否有些额外的条件,程序中定义的数组似乎有点小。

另外可以看看这个帖子,最近这个问题讨论了好多次了。从C版到C#版,还有算法版,题目都是找Sum/2大小的背包。
只不过这道题是要找刚好装满Sum/2的背包,剩下几道是找最接近Sum/2的,相比,这道题还要简单一些。
http://topic.csdn.net/u/20090511/23/a482be66-6598-46fa-be19-e7e356e2244b.html
j8daxue 2009-07-13
  • 打赏
  • 举报
回复
这递归写的非常牛逼啊.
为什么不是背包?SUM为奇数则返回-1,否则对SUM/2背包?
[Quote=引用 15 楼 ThirstyCrow 的回复:]
楼主找到的程序,我给加了注释,希望大家都能看得懂。

Java code
public class EqualTowers {

/**
* @param args the command line arguments
*/
private static final int MAX=250000;
private int[][] mem= new int[50][MAX+1];
private int[] bricks;

public int height(int[] bricks){
this.bricks=bricks;
return go(0,0);
}

/**
*

[/Quote]
bigfoot001 2009-07-13
  • 打赏
  • 举报
回复
MARK
加载更多回复(25)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧