标签:des style http color java os strong io
6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900
4 4 5 9 7
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class HDU1160_ieayoio { public static F[] f; public static Mouse[] a; public static void main(String[] args) { Scanner cin = new Scanner(System.in); a = new Mouse[1010]; int k = 0; while (cin.hasNext()) { // for (int i=1;i<=9;i++){ k++;//老鼠数 a[k] = new Mouse(cin.nextInt(), cin.nextInt(), k); } //先将老鼠按重量从小到大排序,只要对排序后的老鼠对其速度用动态规划找到最长下降子序列就好了 Arrays.sort(a, 1, k + 1, new cmp()); a[0] = new Mouse(0, Integer.MAX_VALUE, 0); f = new F[k + 5]; for (int i = 0; i < f.length; i++) { f[i] = new F(0, 0); } for (int i = 1; i <= k; i++) for (int j = 0; j <= i - 1; j++) { //a[i].size != a[j].size保证重量不等 //若速度满足下降 if (a[i].size != a[j].size && a[i].speed < a[j].speed) { if (f[j].max + 1 > f[i].max) { f[i].max = f[j].max + 1;//找到比f[i]更优的 f[i].last = j;//记录上一个的编号 } } } int maxi = 0, max = Integer.MIN_VALUE; for (int i = 1; i <= k; i++) { if (max < f[i].max) { max = f[i].max;//找到最长下降的位置 maxi = i;//并记录编号 } } System.out.println(f[maxi].max); ptf(maxi);//寻找并输出方案 } static void ptf(int k) { if (k == 0) return; ptf(f[k].last);//递归找起始的老鼠 System.out.println(a[k].index);//输出当前老鼠原本的标号 } } class cmp implements Comparator<Mouse> { @Override public int compare(Mouse o1, Mouse o2) { if (o1.size != o2.size) { return o1.size - o2.size; } else { return o2.speed - o1.speed; } } } class F { int max;//前i个老鼠的速度最长下降老鼠数 int last;//上一个老鼠的编号 F(int max, int last) { this.max = max; this.last = last; } } class Mouse { int size;//老鼠的重量 int speed;//老鼠的速度 int index;//老鼠原本的标号 Mouse(int size, int speed, int index) { this.size = size; this.speed = speed; this.index = index; } }
题目大意:
输入每行两个数,表示老鼠的重量和速度,需要找出所有老鼠中满足体重上升,速度下降的最长序列,输出最长序列数,并依次输出老鼠的标号
先将老鼠按重量从小到大排序,只要对排序后的老鼠对其速度用动态规划找到最长下降子序列就好了
hdu1160,FatMouse's Speed,布布扣,bubuko.com
标签:des style http color java os strong io
原文地址:http://blog.csdn.net/ieayoio/article/details/38373087