UVA 103 - Stacking Boxes
2014-10-18 15:09
351 查看
简单的动态规划,转换为DAG上无固定起点,终点求最长路的问题。
#include <iostream> #include <limits> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std; const int size = 10 + 5; const int n_size = 30 + 5; int A[n_size][size]; int G[n_size][n_size]; int d[n_size] , f[n_size]; int cmp(int x , int y , int m) { int r = A[x][0] - A[y][0]; for(int i = 0 ; i < m ; ++i) { int t = A[x][i] - A[y][i]; if( r * t <= 0) return 0; } if(r < 0) return -1; else return 1; } int dp(int x , int n) { if(d[x] >= 0) return d[x]; int m = 1 , t; for(int i = 0 ; i < n ; ++i) { if(G[x][i]) { t = dp(i , n); if(t + 1 > m) { m = t + 1; f[x] = i; } } } return d[x] = m; } int main() { int n , m; while(scanf("%d%d" , &n , &m) == 2) { for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < m ; ++j) scanf("%d" , &A[i][j]); } for(int i = 0 ; i < n ; ++i) sort(A[i] , A[i] + m); memset(G , 0 , sizeof(G)); for(int i = 0 ; i < n ; ++i) { for(int j = i+1 ; j < n ; ++j) { int r = cmp(i , j , m); if(r < 0) G[i][j] = 1; else if(r > 0) G[j][i] = 1; } } memset(d , -1 , sizeof(d)); memset(f , -1 , sizeof(f)); int m_len = 0 , cur; for(int i = 0 ; i < n ; ++i) { int t = dp(i , n); if(t > m_len) { cur = i; m_len = t; } } cout << m_len << endl << cur + 1; cur = f[cur]; while(cur != -1) { cout << " " << cur + 1; cur = f[cur]; } cout << endl; } return 0; }
相关文章推荐
- UVA 103 Stacking Boxes(DAG 上的最长路及其字典序输出)
- uva 103 - Stacking Boxes
- UVa 103 Stacking Boxes --- DAG上的动态规划
- uva 103 - Stacking Boxes
- Uva103 Stacking Boxes 贪心 深搜 +DP思想
- uva 103 Stacking Boxes
- uva 103 - Stacking Boxes
- UVA 103 Stacking Boxes
- uva103Stacking Boxes——dp
- UVA - 103 Stacking Boxes
- UVa 103 - Stacking Boxes (LIS,打印路径)
- UVA_103 Stacking boxes(DP)
- UVA 103 Stacking Boxes 堆砌盒子(DP)
- uva 103 - Stacking Boxes
- UVA - 103 Stacking Boxes(DAG最长路)
- uva103 - Stacking Boxes(DAG)
- 【解题报告】uva103_Stacking Boxes(堆砌盒子, dp)
- UVA 103 Stacking Boxes
- uva 103 - Stacking Boxes
- uva 103 Stacking Boxes dfs,记忆化