您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: