11.7 马戏团叠罗汉

时间:2022-08-07 11:13:13

思路:定义好Person的数据结构,按照身高和体重排好序。

solutions[i]代表以person[i]结尾的能够叠起的最多人的解。 

solutions[0]初始化,然后求从1~n的情况。

import java.util.ArrayList;
import java.util.Collections;

public class Solution {

public ArrayList<Person> getIncreasingSequence(ArrayList<Person> people) {
Collections.sort(people);
ArrayList
<ArrayList<Person>> solutions = new ArrayList<ArrayList<Person>>();
ArrayList
<Person> first = new ArrayList<Person>();
first.add(people.get(
0));
solutions.add(first);

for (int i = 1; i < people.size(); i++) {
Person cur
= people.get(i);
int len = 0;
int longestPre = -1;
for (int j = 0; j < i; j++) {
ArrayList
<Person> pre = solutions.get(j);
if (cur.isBigger(people.get(j))) {
if (solutions.get(j).size() > len) {
len
= pre.size();
longestPre
= j;
}

}

}
ArrayList
<Person> curSolu = new ArrayList<Person>();
if (longestPre != -1)
curSolu.addAll(solutions.get(longestPre));
curSolu.add(cur);
solutions.add(curSolu);

}

int longestLen = 1;
int longestIdx = -1;
for (int i = 0; i < people.size(); i++) {
if (solutions.get(i).size() > longestLen) {
longestLen
= solutions.get(i).size();
longestIdx
= i;
}
}

return solutions.get(longestIdx);

}

public static void main(String[] args) {
ArrayList
<Person> persons = initialize();
System.out.println(
new Solution().getIncreasingSequence(persons));
}

public static ArrayList<Person> initialize() {
ArrayList
<Person> items = new ArrayList<Person>();

Person item
= new Person(65, 60);
items.add(item);

item
= new Person(70, 150);
items.add(item);

item
= new Person(56, 90);
items.add(item);

item
= new Person(75, 190);
items.add(item);

item
= new Person(60, 95);
items.add(item);

item
= new Person(68, 110);
items.add(item);

item
= new Person(35, 65);
items.add(item);

item
= new Person(40, 60);
items.add(item);

item
= new Person(45, 63);
items.add(item);

return items;
}
}

class Person implements Comparable<Person> {
int w;
int h;

public Person(int w, int h) {
this.w = w;
this.h = h;
}

public int compareTo(Person p) {
if (h != p.h)
return ((Integer) h).compareTo(p.h);
else
return ((Integer) w).compareTo(p.w);
}

public String toString() {
return "(" + w + "," + h + ")";
}

public boolean isBigger(Person b) {
if (this.w > b.w && this.h > b.h)
return true;
else
return false;
}

}