uva 103(最长递增子序列) Stacking Boxes

大意是有一些n维的物体,他的边也是n条,如果将一个物体的边按任意顺序排列,只要有一种排列满足一一对应小于另一物体的边,就可以将这个物体嵌套进去另一个物体中,文最多能连续嵌套几个物体。

所求的最多的连续嵌套数与最长递增子序列相似,只不过一般的是单个数的比较,这里是一列数的比较。还有就是满足条件的嵌套的物体的编号用递归来求。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int n,m,dp[32],s[32];
 8 bool vis[32][32];
 9
10 struct node{
11     int num[32];
12     int odr;
13     friend bool operator <(const node & x,const node & y) {
14          for (int i=1 ; i<=m ; i++)
15             if (x.num[i]>y.num[i]) return false;
16          return true;
17     }
18 }a[32];
19
20 bool jjc(int x,int y)
21 {
22     for (int i=1 ; i<=m ; i++)
23         if (a[x].num[i]>=a[y].num[i]) return false;
24     return true;
25 }
26
27 void dfs(int i){
28     if (i!=s[i]) dfs(s[i]);
29     printf("%d ",a[i].odr);
30 }
31
32 int main()
33 {
34     while (~scanf("%d%d",&n,&m))
35     {
36         for (int i=1 ; i<=n ; i++){
37             for (int j=1 ; j<=m ; j++){
38                 scanf("%d",&a[i].num[j]);
39             }
40             a[i].odr=i;
41             sort(a[i].num+1,a[i].num+m+1);
42         }
43         sort(a+1,a+n+1);
44         memset(vis,false,sizeof(vis));
45         for (int i=1 ; i<=n ; i++){
46             for (int j=i+1 ; j<=n ; j++){
47                 if (jjc(i,j)) vis[i][j]=true;
48             }
49         }
50         memset(dp,0,sizeof(dp));
51         dp[1]=s[1]=1;
52         for (int i=2 ; i<=n ; i++){
53             s[i]=i;
54             for (int j=1 ; j<i ; j++){
55                 if (vis[j][i]&&dp[i]<dp[j]+1)
56                     dp[i]=dp[j]+1,s[i]=j;
57             }
58         }
59         int maxn=0,pos=1;
60         for (int i=1 ; i<=n ; i++)
61             if (maxn<dp[i]) maxn=dp[i],pos=i;
62         printf("%d\n",maxn);
63         dfs(pos);
64         printf("\n");
65     }
66     return 0;
67 }
时间: 2024-10-31 03:07:52

uva 103(最长递增子序列) Stacking Boxes的相关文章

最长递增子序列问题 2011-12-29

算法实现题8-6 最长递增子序列问题(习题 8-17) ´问题描述: 给定正整数序列 n x x , ,1 ? . (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和 xn,则从给定序列中最多可取出多少个长度为s的递增子序列. ´编程任务: 设计有效算法完成(1)(2)(3)提出的计算任务. ´数据输入: 由文件input.txt提供输入数据.文件第1 行有 1个正整数n,表示给定序列的长度.接下来的1

【网络流24题】 最长递增子序列问题

(题目复制自洛谷) 题目描述 给定正整数序列x1,...,xn . (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列. 编程任务: 设计有效算法完成(1)(2)(3)提出的计算任务. 输入输出格式 输入格式: 第1 行有1个正整数n,表示给定序列的长度.接下来的1 行有n个正整数n:x1, ..., xn. 输出格式: 第1 行是最长递增子序列的

LIS(最长递增子序列)和LCS(最长公共子序列)的总结

最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2) s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1; s1[i - 1] != s2[j - 1], dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]); 初始化:dp[i][0] = dp[0][j] = 0; 伪代码: dp[maxn1][ma

[网络流24题] 最长递增子序列

[网络流24题] 最长递增子序列 «问题描述:给定正整数序列x1,..., xn.(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列. 注意:这里的最长递增子序列即最长不下降子序列!!!«编程任务:设计有效算法完成(1)(2)(3)提出的计算任务.«数据输入:由文件alis.in提供输入数据.文件第1 行有1个正整数n(n<=500),表示给定序列的长

HDU 3998 Sequence (最长递增子序列+最大流SAP,拆点法)经典

Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1666    Accepted Submission(s): 614 Problem Description There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequ

算法面试题 之 最长递增子序列 LIS

找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E6%95%B0%E7%BB%84%E9%83%BD%E6%B2%A1%E7%BB%99%E5%87%BA%E6%9D%A5 我就是理解了一下他的分析 用更通俗易懂的话来说说题目是这样 d[1..9] = 2 1 5 3 6 4 8 9 7 要求找到最长的递增子序列首先用一个数组b[] 依次的将d里面

[网络流24题]最长递增子序列问题

题目大意:给定长度为n的序列a,求:1.最长递增子序列长度:2.最多选出几个不相交的最长递增子序列:3.最多选出几种在除了第1个和第n个以外的地方不相交的最长递增子序列.(n<=1000) 思路:先倒着DP,求出f[i]表示以a[i]开头的最长的递增子序列长度,然后建图,若f[i]=最长递增子序列长度则S向i连1,若f[i]=1则i向T连1,若i<j且a[i]<a[j]且f[i]=f[j]+1则i向j连1,为保证每个点只被流一次,拆成入点和出点,流量限制1,跑最大流即可解决第二问,点1和

最大子数组之和、最大子数组之积、最长递增子序列求法

昨天做爱奇艺笔试题,最后一道编程题是求整型数组最长递增子序列,由于时间关系,没有完全写出来,今天重新来做做这一系列题. <1> 最大子数组之和 首先从最简单的最大子数组之和求取.数组里有正数.负数.零.设包含第 i 个元素的子数组的和为 Sum,则Sum的值为 Sum(i) = Sum(i-1) + arrey[i]; 显然如果arrey[i]<=0,则Sum(i)<=Sum(i-1);则必须把Sum(i)=arrey[i];同时maxSum用来保存Sum最大值.时间复杂度为o(n

求数组中最长递增子序列

编程之美有一道关于数组中最长递增子序列,题目如下: 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列的长度为4(如1,2,4,6),从该书给的例子我们可以知道的是其最长的递增子序列可以不连续的. 作者利用动态规划方法给了三种解法. 解法一: 根据无后效性的定义,各阶段按照一定的次序排列好之后,对于某个给定阶段的状态来说,它以前各阶段的状态无法直接影响它未来的决策,而只能间接地通过当前状态来影