uva 103 - Stacking Boxes
2013-08-12 20:39
471 查看
最长上升子序列 先对维数进行排序 然后再对几个盒子进行排序 最后利用vis数组来存路径 最后就是利用回溯来输出路径
View Code
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct dat { int num[30]; int number; } a[33]; int n,m; int dp[33]; int vis[33],st; bool cmp(dat p, dat q) { for(int i=0; i<n; i++) if(p.num[i]!=q.num[i]) return p.num[i]<q.num[i]; return p.num[0]==q.num[0]; } bool solve(dat p, dat q) { for(int i=0; i<n; i++) if(p.num[i]>=q.num[i]) return false; return true; } void dfs(int x) { if(vis[x]!=-1) dfs(vis[x]); if(x==st) printf("%d\n",a[x].number); else printf("%d ",a[x].number); } int main() { while(scanf("%d %d",&m,&n)==2) { for(int i=0; i<m; i++) { for(int j=0; j<n; j++) scanf("%d",&a[i].num[j]); a[i].number=i+1; sort(a[i].num,a[i].num+n); } sort(a,a+m,cmp); // for(int i=0; i<m; i++) // { // for(int j=0; j<n; j++) // cout << a[i].num[j] << ' '; // cout << a[i].number << endl; // } memset(dp, 0, sizeof(dp)); memset(vis, -1, sizeof(dp)); dp[0]=1; int mm=0; int ans=-1; for(int i=1; i<m; i++) { mm=0; for(int j=0; j<i; j++) { if(solve(a[j],a[i]) && dp[j]>mm) { mm=dp[j]; vis[i]=j; } } dp[i]=mm+1; if(ans<dp[i]) { ans=dp[i]; st=i; } } printf("%d\n",ans); dfs(st); } return 0; }
View Code
相关文章推荐
- uva 103 Stacking Boxes (DAG)
- UVA - 103 Stacking Boxes
- UVa 103 Stacking Boxes 堆砌盒子(DP 最长条件子序列)
- UVa103 - Stacking Boxes
- UVA 103 - Stacking Boxes
- UVA - 103 Stacking Boxes
- UVa 103 Stacking Boxes (DP&DAG)
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
- UVa 103 Stacking Boxes
- UVa 103 - Stacking Boxes(dp求解)
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
- UVa 103 - Stacking Boxes
- UVa 103 Stacking Boxes --- DAG上的动态规划
- 【DP】UVA 103 Stacking Boxes 输出路径
- UVA 103 Stacking Boxes(DAG 上的最长路及其字典序输出)
- UVa Problem 103 - Stacking Boxes
- uva103-Stacking_Boxes(dp最长递增子序列)
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
- 【DP】UVA 103 Stacking Boxes 输出路径
- UVa 103 Stacking Boxes 解题源码