链接:UVa 103

题意:给n维图形,它们的边长是{d1,d2,d3...dn},  对于两个n维图形,求满足当中一个的全部边长

依照随意顺序都一一相应小于还有一个的边长,这种最长序列的个数,而且打印随意一个最长子串的路径,

比如:a(9,5,7,3),b(6,10,8,2),c(9,7,5,1),a和b不满足,但c和b满足

分析:首先对没组边长从小到大排序,再对各组图形按最小边排序,再求最大子串,

对于打印路径,能够逆序循环,也可递归求解

#include<cstdio>
#include<algorithm>
using namespace std;
int dp[35],path[35],num,m,k;
struct stu
{
int a[12],id;
}s[35];
int cmp(struct stu s1,struct stu s2)
{
return s1.a[1]<s2.a[1];
}
/*void back_path1(int i)
{
if(path[i]!=i)
back_path1(path[i]);
printf("%d",s[i].id);
num++;
if(num!=m)
printf(" ");
else
printf("\n");
}*/
/*void back_path2(int i)
{
if(k--){
back_path2(path[i]);
printf("%d",s[i].id);
num++;
if(num!=m)
printf(" ");
else
printf("\n");
}
}*/
int main()
{
int i,j,n,pos,b[1005];
while(scanf("%d%d",&m,&n)!=EOF){
for(i=1;i<=m;i++){
s[i].id=i;
for(j=1;j<=n;j++)
scanf("%d",&s[i].a[j]);
sort(s[i].a+1,s[i].a+n+1); //对每一个图形的边长排序
}
sort(s+1,s+m+1,cmp); //对各个图形之间,按最小边长的大小排序
for(i=1;i<=m;i++){
dp[i]=1;
path[i]=i;
for(j=1;j<i;j++){
for(k=1;k<=n;k++)
if(s[j].a[k]>=s[i].a[k])
break;
if(k==n+1&&dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
path[i]=j;
}
}
}
pos=1;
for(i=2;i<=m;i++)
if(dp[i]>dp[pos])
pos=i;
m=dp[pos];
printf("%d\n",m);
b[1]=s[pos].id; //先把最后一个编号增加
i=2;
for(j=pos-1;j>=1;j--){ //逆序循环求路径
for(k=1;k<=n;k++)
if(s[j].a[k]>=s[pos].a[k])
break;
if(k==n+1&&dp[j]+1==dp[pos]){
b[i++]=s[j].id;
dp[pos]--;
}
if(dp[pos]==1)
break;
}
for(j=i-1;j>1;j--)
printf("%d ",b[j]);
printf("%d\n",b[1]);
/*num=0; //递归方法1
back_path1(pos);*/
/*num=0; //递归方法2
k=m;
back_path2(pos);*/
}
return 0;
}

UVa 103 - Stacking Boxes (LIS,打印路径)的更多相关文章

  1. UVA 103 Stacking Boxes --LIS

    实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...

  2. UVa 103 Stacking Boxes --- DAG上的动态规划

    UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...

  3. uva 103 Stacking Boxes(DAG)

    题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...

  4. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)

     Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simple in one or t ...

  5. UVa 103 - Stacking Boxes(dp求解)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  6. UVa 103 - Stacking Boxes

    题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...

  7. uva 103 Stacking Boxes(最长上升子序列)

    Description    Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simp ...

  8. UVA 103 Stacking Boxes n维最长上升子序列

    题目链接:UVA - 103 题意:现有k个箱子,每个箱子可以用n维向量表示.如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6 ...

  9. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

随机推荐

  1. Swift - 计算次方(2的N次方,2的随机次方)

    1,使用<<计算2的N次方 1 2 var value = 1<<4  //2的4次方 var value = 1<<Int(arc4random_uniform( ...

  2. Java Design Demo -简单的队列-异步多任务队列(java android)

    简单的单线程队列 -- 工作的时候遇到劣质打印机.给打印机发消息,打印机就会打印,如果在打印机还在打印的时候,就 再发消息打印,就会出现消息丢失.所以需要给上一个任务一些处理的间隔时间. 单线程的消息 ...

  3. php与文件操作

    一.目录操作 首先是从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出: <?php $base_dir="fil ...

  4. MySQL字符集编码

    MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...

  5. Photoshop图象切片保存为网页HTML(DIV+CSS布局)的方法

    首先,制作图象切片(以一张图片为例子) 一.选择“切片”工具,在图像上拖动以分割图像(例如:一张图像切割2次就形成3个切片)切片后如下图 二.设置切片选项(如大小.目标链接.图片说明等等):选择“切片 ...

  6. 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

    程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...

  7. [Android学习笔记]组合控件的使用

    组合控件的使用 开发过程中,多个UI控件需要协同工作,相互交互之后,才可完成一个完整的业务需求,此时可把这些控件封装成为一个整体,相互之间的交互逻辑封装其中,外部调用可无需关心内部逻辑,只需获取处理后 ...

  8. iOS_10_tableView的简单使用_红楼十二钗

    终于效果图: 方式1,用字典数组 BeyondViewController.h // // BeyondViewController.h // 10_tableView // // Created b ...

  9. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  10. 在C#中子线程如何操作主窗口线程上的控件

    在C#中子线程怎样操作主线程中窗口上控件 在C#中,直接在子线程中对窗口上的控件操作是会出现异常,这是因为子线程和运行窗口的线程是不同的空间,因此想要在子线程来操作窗口上的控件.是不可能简单的通过控件 ...