uva 10131 Is Bigger Smarter? dag 最长路 加路径还原

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <climits>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#define INF 100000000

using namespace std;
struct node{
	int x,y;
};

node a[1005];
int n;
int ma[1005][1005];
int dp[1005];

void print(int max,int q){
	if(max == 1){
		printf("%d\n",q+1);
		return ;
	}
	printf("%d\n",q+1);
	for(int i = 0;i < n;i++){
		if(ma[q][i] && dp[i] == max-1){
			print(max-1,i);
			break;
		}
	}

}
int fun(node &x,node &y){
	if(x.x < y.x && x.y > y.y) return 1;
	return 0;
}
int dfs(int cur){
	int& ret = dp[cur];
	if(ret > 0) return ret;
	ret = 1;
	for(int i = 0;i < n;i++){
		if(ma[cur][i]){
			ret = max(dfs(i)+1,ret);
		}
	}
	return ret;
}
int main(){
	while(scanf("%d%d",&a[n].x,&a[n].y)!=EOF) n++;
	memset(ma,0,sizeof(ma));

	for(int i = 0;i < n;i++){
		for(int j = 0;j < n;j++){
			if(fun(a[i],a[j]) > 0){
				ma[i][j] = 1;
			}
		}
	}	

	for(int i = 0;i < n;i++){
		dfs(i);
	}

	int maxn;
	int max = -1;
	for(int i = 0;i < n;i++){
		if(dp[i] > max){
			maxn = i;
			max = dp[i];
		}
	}
	cout << max << endl;
	print(max,maxn);
	return 0;
}

时间: 2024-11-06 11:53:45

uva 10131 Is Bigger Smarter? dag 最长路 加路径还原的相关文章

uva 10131 Is Bigger Smarter? (DAG)

uva 10131 Is Bigger Smarter? 题目大意:当一只大象的体重大于另一只的体重,且智商小于另一只的智商,该大象便可以"嵌套"另一只大象.问,最长的嵌套方式.(答案不唯一) 解题思路:DAG. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; struct ELE{ int w

UVA 10131 Is Bigger Smarter?(DP最长上升子序列)

Description Question 1: Is Bigger Smarter? The Problem Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to take the data on a collection of elephants and put as large a subset of this data as possible in

UVA 10131 Is Bigger Smarter? 【严格单调递增子序列】

题目:UVA 10131 Is Bigger Smarter 题意:给出大象的身高和体重,求身高递增且体重递减的最长序列,都是严格的,并打印序列. 分析:就是先对身高按自增排序,然后求一个单调递减子序列,严格单调的,所以加一句判断,然后打印序列,用一个数组保存就好了 开始想的是先预处理掉重复的,提交wa了,这样不行,因为你不知道体重是最高的还是最低的,可能开始留高的好,后面低的比较好.所以..... AC代码: #include<iostream> #include<cstdio>

UVa 10131 Is Bigger Smarter? (LDS+数据结构排序)

Is Bigger Smarter? Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Question 1: Is Bigger Smarter? The Problem Some people think that the bigger an elephant is, the smarter it is. To disprove this, y

Uva 10131 Is Bigger Smarter? (LIS,打印路径)

option=com_onlinejudge&Itemid=8&page=show_problem&problem=1072">链接:UVa 10131 题意:给定若干大象的体重及智商值.求满足大象体重严格递增,智商严格递减的序列的最大个数. 并打印随意一组取得最大值的序列的大象编号 分析:这个是LIS的应用,仅仅只是推断条件有两个,能够先对大象的体重排序,可是要打印路径. 那就必须得回溯求路径.能够直接逆序循环求,当然递归也是一个好的选择 #include<

UVA 10131 Is Bigger Smarter?(DP)

Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to take the data on a collection of elephants and put as large a subset of this data as possible into a sequence so that the weights are increasing, but t

UVa 10131 - Is Bigger Smarter?

题目:有人认为大象的体重和智力有一定的正相关性,现在给你一些数据,找到一个最长的反例序列. 分析:dp,LIS,醉倒上升子序列.对W排序求出S的最大下降子序列即可,存储路径前驱,dfs输出. 说明:先读到EOF再处理. #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n

UVA 11324 The Largest Clique (强连通缩点 + DAG最长路)

链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=30726 题意 : 有向图G,求一个最大的点集,使得点集中任意两个节点u和v,满足 要么u可以到达v,要么v可以到达u,或者u和v可以相互到达. 可以强连通缩点成一张DAG,以为每个强连通分量要么选要么不选.求DAG上的最长路 二次建图 用了2种不同的方法,也分别用了记忆花搜索DP和直接递推DP vector建图和记忆化搜索: #include <algorithm