UVA 103 Stacking Boxes --LIS
实际上是一个扩展维度的矩形嵌套问题。
一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断是否能够嵌套。然后将箱子按第一维度从小到大排序,然后就是求一个“严格上升子序列”了。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 47 struct Box { int w[12]; int ind; }box[34]; int dp[N],little[N],ans[N]; int cmp(Box ka,Box kb) { return ka.w[1] < kb.w[1]; } void print_path(int tag) { int k = 1,i; while(1) { ans[k++] = box[tag].ind; if(little[tag] == -1) break; tag = little[tag]; } for(i=k-1;i>=2;i--) printf("%d ",ans[i]+1); printf("%d\n",ans[i]+1); } int main() { int n,m,i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { box[i].ind = i; for(j=1;j<=m;j++) { scanf("%d",&box[i].w[j]); } sort(box[i].w+1,box[i].w+m+1); } sort(box,box+n,cmp); for(i=0;i<n;i++) dp[i] = 1,little[i] = -1; for(i=1;i<n;i++) { for(j=0;j<i;j++) { int flag = 1; for(k=1;k<=m;k++) { if(box[i].w[k] <= box[j].w[k]) { flag = 0; break; } } if(flag) { if(dp[i] < dp[j]+1) { dp[i] = dp[j]+1; little[i] = j; } } } } int maxi = -1,tag; for(i=0;i<n;i++) { if(dp[i] >= maxi) { maxi = dp[i]; tag = i; } } printf("%d\n",maxi); print_path(tag); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com