您的位置:首页 > 其它

UVA 10131 Is Bigger Smarter? DP

2013-04-14 21:50 387 查看
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的输出更加烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: