UVA 10131 Is Bigger Smarter? DP

来源:互联网 发布:js 数组循环添加对象 编辑:程序博客网 时间:2024/06/06 03:50
import java.io.*;import java.util.*;class pair implements Comparable<pair>{    int a,b,c;    pair(int x, int y, int z){        a=x;b=y;c=z;    }    @Override    public int compareTo(pair t1) {        if(this.a == t1.a){            return this.b-t1.b;        }else{            return this.a-t1.a;        }    }    }public class Main {        public static void dp(int s, pair[] arr){        int[] table = new int[s];        int[] pre = new int[s];        int max = 0;        int f = -1;        Arrays.fill(table, 1);        for(int i=0;i<s;i++){            pre[i] = -1;        }        for(int i=1;i<s;i++){            for(int j=i-1;j>=0;j--){                if(arr[i].b<arr[j].b&&arr[i].a>arr[j].a){                    if(table[j]+1>table[i]){                        table[i] = table[j]+1;                        pre[i] = j;                    }                }            }            if(table[i]>max){                max = table[i];                f = i;            }        }        System.out.println(max);        back(pre,f,arr);    }    public static void back(int[] p,int start, pair[] arr){        if(p[start]!=-1)            back(p,p[start],arr);        System.out.println(arr[start].c);    }    public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        int count = 0;        pair[] arr = new pair[1001];        Arrays.fill(arr, new pair(99999999,99999999,99999999));        while(scan.hasNextInt()){            arr[count++] = new pair(scan.nextInt(),scan.nextInt(),count);        }        Arrays.sort(arr);        dp(count,arr);    }};


最近在切动态规划,于是去UVA切题,最然早在2011年就会了DP, 但是中间工作等原因断了N久没碰

遗忘得只会LCS这样的了。。。汗

而且当时就觉着DP怎么都学不通,这次再作为一个难点多多学习。


这题思路还是比较明显的,可恶的是我在输出具体sample的时候犯了各种错误,还有把输出写到了if 条件里面,回溯结果少了一个。。

我还以为是算法错了,但是不对啊,这么明显的算法怎么可能错呢。。。。。悲剧地交了7次。。。

状态很差,学的时候还是没有集中精神啊。



网上还有一种思路就是排序后和原数组求LCS,算法貌似应该是正确的,我很汗啊 怎么会有人这样思考。

但是LCS作为2维DP,最后一步具体sample的输出更加烦。