UVA 103 Stacking Boxes n维最长上升子序列
题目链接:UVA - 103
题意:现有k个箱子,每个箱子可以用n维向量表示。如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6)可以和箱子(7,3)套接在一起。求出套接的箱子最多的个数前提下任意一种解决方案。
算法:抛开n维不看,本题就是一个DP的最长上升子序列问题,现在加上了n维的限制,想想也不是很难吧,在DP过程中判断每一维都满足条件即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 typedef long long LL; 10 11 int k,n; 12 int dp[33],pre[33]; 13 struct node 14 { 15 int an[13]; 16 int id; 17 friend bool operator < (node a,node b) 18 { 19 for (int i=0 ;i<n ;i++) 20 { 21 if (a.an[i] != b.an[i]) return a.an[i] < b.an[i]; 22 } 23 } 24 }arr[33]; 25 26 void printOut(int u) 27 { 28 if (pre[u]!=-1) printOut(pre[u]); 29 if (pre[u]==-1) printf("%d",arr[u].id+1 ); 30 else printf(" %d",arr[u].id+1 ); 31 } 32 33 int main() 34 { 35 while (scanf("%d%d",&k,&n)!=EOF) 36 { 37 memset(dp,0,sizeof(dp)); 38 memset(pre,-1,sizeof(pre)); 39 for (int i=0 ;i<k ;i++) 40 { 41 for (int j=0 ;j<n ;j++) 42 scanf("%d",&arr[i].an[j]); 43 arr[i].id=i; 44 sort(arr[i].an,arr[i].an+n); 45 } 46 sort(arr,arr+k); 47 // for (int i=0 ;i<k ;i++) 48 // { 49 // for (int j=0 ;j<n ;j++) 50 // cout<<arr[i].an[j]<<" "; 51 // cout<<endl; 52 // } 53 for (int i=0 ;i<k ;i++) 54 { 55 int temp=0; 56 for (int j=0 ;j<i ;j++) 57 { 58 int flag=0; 59 for (int u=0 ;u<n ;u++) 60 if (arr[i].an[u]<=arr[j].an[u]) {flag=1;break; } 61 if (!flag && dp[j]>temp) 62 { 63 temp=dp[j]; 64 pre[i]=j; 65 } 66 } 67 dp[i]=temp+1; 68 } 69 int maxlen=-1,num=0; 70 for (int i=0 ;i<k ;i++) 71 { 72 if (dp[i]>maxlen) 73 { 74 maxlen=dp[i]; 75 num=i; 76 } 77 } 78 printf("%d\n",maxlen); 79 printOut(num); 80 printf("\n"); 81 } 82 return 0; 83 }