当前位置: 首页 > 知识库问答 >
问题:

“马戏团塔”的算法

徐峰
2023-03-14
(ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110) 

最长塔的长度为6,从上到下包括:

(56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)

下面是书中的解决方案:

“当我们把这个问题的绒毛都剪掉的时候,我们就能明白问题其实是下面的了。

      {1,1} 
   {3,3} {7,2}
{6,4} {9,9} {8,5}

共有1个答案

姚建树
2023-03-14

不,您的值不是按非递减顺序排列的。正如@mooseboys评论所说,在你的例子中,第三个值的权重大于第二个值。({3,3}->{7,2},2<3)

该问题是最长递增子序列(LIS)(DP)的一个微小变化。

您可以根据高度对元素进行排序,然后对Weight应用find the longly Increasing subsequence。

请找到下面的java实现:

class Person implements Comparable<Person> {
    int height;
    int weight;

    public Person(int height, int weight) {
        this.height = height;
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Person{" +
                "height=" + height +
                ", weight=" + weight +
                '}';
    }

    @Override
    public int compareTo(Person p) {
        if(this.height>p.height) {
            return 1;
        } else if(this.height < p.height) {
            return -1;
        } else {
            return 0;
        }
    }
}

public class CircusTower {

    public void calculatePeople(Person[] input) {

        int weightArray[] = new int[input.length];
        String[] output = new String[input.length];
        for (int i=0;i<input.length;i++) {
            weightArray[i] = 1;
            output[i] = input[i].toString() + "";
        }
        int maxLength = 0;

        for (int i=1;i<input.length;i++) {
            for (int j=0;j<i;j++) {
                if( weightArray[j]+1>weightArray[i] && input[i].weight>input[j].weight) {
                    weightArray[i] = weightArray[j] + 1;
                    output[i] = output[j] + " " + input[i].toString();
                    if(maxLength<weightArray[i]) {
                        maxLength = weightArray[i];
                    }
                }
            }
        }

        System.out.println();


        for (int i = 0; i < input.length; i++) {
            if (weightArray[i] == maxLength) {
                System.out.println("Longest Increasing subsequence - " + output[i] + " of length = " + maxLength);
            }
        }

    }

    public static void main(String[] args) {
        CircusTower ct = new CircusTower();
        Person p1 = new Person(65,100);
        Person p2 = new Person(70,150);
        Person p3 = new Person(56, 90);
        Person p4 = new Person(75, 190);
        Person p5 = new Person(60, 95);
        Person p6 = new Person(68, 110);

        Person[] array = new Person[]{p1,p2,p3,p4,p5,p6};

        Arrays.sort(array);

        ct.calculatePeople(array);

    }

}

我在用LIS问题的n平方实现,U也可以用NlogN中更好的一个。

希望它能澄清。

 类似资料:
  • 游戏很简单:怪物从地图左上角出现,前往右下角,你的任务是建造炮台或围墙,阻止怪物的前进。每当有怪物到达终点,你游戏中的生命值就会下降,如果生命值降为 0 ,游戏就输了。目前这个版本中,怪物是无穷无尽的,游戏目的就是要抵抗尽可能长的时间。  

  • 一面    8.13 1、Hash冲突处理方法? 2、Hash扩容 3、二叉搜索树的插入、查询、删除操作说说,以及时间复杂度是多少? 4、贪心算法取得最优解的条件是什么? 5、贪心算法和动态规划有什么区别? 6、说说线程是怎么工作的? 7、说说数据库查询是什么样的? 8、说说TCP有哪些机制,挑一个你最熟悉的机制说说 9、几乎有序的数组排序 https://www.cnblogs.com/layd

  • 汉诺塔是由法国数学家爱德华·卢卡斯在 1883 年发明的。他的灵感来自一个传说,有一个印度教寺庙,将谜题交给年轻的牧师。在开始的时候,牧师们被给予三根杆和一堆 64 个金碟,每个盘比它下面一个小一点。他们的任务是将所有 64 个盘子从三个杆中一个转移到另一个。有两个重要的约束,它们一次只能移动一个盘子,并且它们不能在较小的盘子顶部上放置更大的盘子。牧师日夜不停每秒钟移动一块盘子。当他们完成工作时,

  • 不知道什么时候报的提前批,今天喊我去笔试(笑)。题目共四道,分别是一星二星三星四星四种难度(其实个人感觉难度都差不多)。 一星题是根据n边形的边长和图形中心到顶点的值去估计pi的值 二星题是手撕迪杰斯特拉算法 三星题是动态规划的变种(我做的超了空间复杂度,只过了20% qwq) 四星题是算圆是否与给定正方形相交

  • 我将保持简短,我正在做一个塔防御游戏作为一个迷你项目,而我有一些空闲时间,我正在试图弄清楚如何我可以实现的塔,以能够射击敌军时,他们进入射程使用dist但我只是不知道如何实现一个方法,使用敌军的位置和塔的位置。我有一个爬行精灵和塔的数组列表 如果有人能给我一些指导,告诉我如何让高塔能够射杀这些怪物,那将是很棒的,即使它不能摆脱它们,只是能够射杀它们也是很棒的。 干杯

  • 1h左右 自我介绍 除了go还会什么语言 go 如何实现读写锁,写一下代码 给定一个 m*n的矩阵,存在若干障碍物,如何判断从中心点A上下左右八个方向移动,是否存在前往四个角落的路径 - dfs / bfs (效率太低) - 三维dp,让手写了转移方程 - 如何优化 - 启发式算法有了解吗? - 不了解,讲了一下大致思想,问如何设计估价函数,如何选择下一个节点? - 迪杰斯特拉了解吗,他和启发式算