UVa 103 - Stacking Boxes (LIS,打印路径)
题意:给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,打印路径)的更多相关文章
- UVA 103 Stacking Boxes --LIS
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
- UVa 103 Stacking Boxes --- DAG上的动态规划
UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...
- uva 103 Stacking Boxes(DAG)
题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
Stacking Boxes Background Some concepts in Mathematics and Computer Science are simple in one or t ...
- UVa 103 - Stacking Boxes(dp求解)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVa 103 - Stacking Boxes
题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...
- uva 103 Stacking Boxes(最长上升子序列)
Description Stacking Boxes Background Some concepts in Mathematics and Computer Science are simp ...
- UVA 103 Stacking Boxes n维最长上升子序列
题目链接:UVA - 103 题意:现有k个箱子,每个箱子可以用n维向量表示.如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
随机推荐
- 基于visual Studio2013解决面试题之0407数组差
题目
- javascript事件委托,事件代理,元素绑定多个事件之练习篇
<ul id="parent-list"> <li id="post-1">item1</li> <li id=&qu ...
- Android网络:开发浏览器(五)——功能完善之保存图片实现
最近几天开学,所以没有更新博客.今天开始更新.最近我打算每天抽出一些事件看点Thinkin Java这本书,仔细研究下java,当然也会出这个博客关于Think in java系列的博客,大家可以一起 ...
- Wireshark入门与进阶---数据包捕获与保存的最基本流程
Wireshark入门与进阶系列(一) "君子生非异也.善假于物也"---荀子 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原 ...
- UVA 10795 - A Different Task(递归)
A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Brie ...
- XenCenter注册码一年申请
http://deliver.citrix.com/go/citrix/xenserver_activation?transactionID=2f65d2f134bf485d871291a566d67 ...
- Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...
- SharePoint场管理-PowerShell(二)
1. 合并Log文件 Merge-SPLogFile –Path E:\Logs\MergedLog.log –StartTime "1/19/2010" –Overwrite 2 ...
- cocos2d/-x 用CCRenderTexture为一个CCLabelTTF创建阴影。
游戏UI中为了使字体更加漂亮,通常需要为字体添加一个阴影.其实不用美工,程序就可以添加.先为CCLabelTTF创建一个CCRenderTexture: CCRenderTexture* CCLabe ...
- OMR数据查询
查询 1.查询所有的. var query = from p in _Context.Info select p; var query = _Context.Info; 2.单条件查询 等值查 var ...