UVA 103 - Stacking Boxes

来源:互联网 发布:手机拍照定位软件 编辑:程序博客网 时间:2024/06/08 17:08

简单的动态规划,转换为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;}


0 0
原创粉丝点击