UVa 103
来源:互联网 发布:rar怎么解压到mac 编辑:程序博客网 时间:2024/04/19 22:59
问题链接:
点击打开链接
解题思路:
根据题目输入的维度,将n维度的盒子按照维度边从小到大排序,再将1到k个盒子进行比较,若一个盒子a排序后的所有维度边相对应另一个盒子b排序后的所有维度边小,则a可以嵌入b中,以此来生成邻接矩阵。使用动态规划法,状态转移方程为 dp(i)=max{dp(j)+1},其中j取1到k。
代码如下:
//动态规划方法#include<cstdio>#include<stdlib.h>#include<cstring>int k;//[1 30]int n;//[1 10]int A[35][15];int flag[35][35];int d[35];int next[35];int dp(int i){ if(d[i]>0)return d[i]; d[i]=1; next[i]=0; int cur; for(int j=1;j<=k;++j) { if(flag[i][j]==1) { cur=dp(j)+1; if(cur>d[i]) { d[i]=cur; next[i]=j; } } } return d[i];}//判断a是否可嵌入bint isNest(int* a,int* b){ for(int i=0;i<n;++i) { if(a[i]>=b[i])return 0; } return 1;}int cmp(const void* a,const void* b){ return *(int*)a-*(int*)b;}int main(){ int a; while(scanf("%d%d",&k,&n)==2) { memset(flag,0,sizeof(flag)); memset(d,0,sizeof(d)); for(int i=1;i<=k;++i) { for(int j=0;j<n;++j)scanf("%d",A[i]+j); qsort(A[i],n,sizeof(A[0][0]),cmp); } //生成邻接矩阵 for(int i=1;i<=k;++i) { for(int j=1;j<=k;++j) { if(i==j)continue; if(isNest(A[i],A[j]))flag[i][j]=1; } } /*for(int i=1;i<=k;++i) { for(int j=1;j<=k;++j)printf("%d ",flag[i][j]); putchar('\n'); }*/ int max=0,site; for(int i=1;i<=k;i++) { int cur=dp(i); if(max<cur) { max=cur; site=i; } } printf("%d\n",max); printf("%d ",site); int i=site; while(next[i]) { i=next[i]; printf("%d ",i); } putchar('\n'); } return 0;}
0 0
- UVa 103
- UVA 103
- UVA 103
- uva 103
- UVa 103
- uva 103
- uva 103/UVA 10405 [lcs]
- UVa 103 Stacking Boxes
- UVA 103 - Stacking Boxes
- uva 103 - Stacking Boxes
- uva 103 Stacking Boxes
- [UVA 103] Stacking Boxes
- uva:103 - Stacking Boxes
- UVa 103 - Stacking Boxes
- UVA - 103 Stacking Boxes
- uva 103 - Stacking Boxes
- UVA 103 Stacking Boxes
- UVa 103 - Stacking Boxes
- Hadoop使用
- 学习记录 监听器与过滤器
- Matlab R2016a破解安装教程
- 快排算法的实现
- 简单排序 模板
- UVa 103
- c++基础之模板函数
- 函数指针和函数对象
- [BZOJ2329][HNOI2011]括号修复 平衡树
- 当不确定输入数组为多少个的时候
- 欢迎使用CSDN-markdown编辑器
- 【Basic Code】一道“单例”的笔试题
- C++第2次实验报告项目1输出完数
- frameset标签设计页面