您的位置:首页 > 其它

uva 103

2017-05-16 21:26 225 查看
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

int a[30 + 5][30 +5];
struct node{
int o;
int po;
}dis[30 + 5];
bool vis[30 + 5][30 + 5];
int n,k;

bool isOk(int x[],int y[]){
for(int i = 0; i < k; i++)
if(x[i] >= y[i])
return false;
return true;

}

bool cmp(node a, node b){
return a.o < b.o;
}
int dfs(int x){
int ans;
int Max = 0;
for(int i = 0; i < n; i++){
if(vis[x][i]){
if(dis[i].o)
ans = 1 + dis[i].o;
else
ans = 1 + dfs(i);
if(ans > Max)
Max = ans;
}
}
return Max;
}

int main(){

while(~scanf("%d%d",&n,&k)){
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
scanf("%d",&a[i][j]);
for(int i = 0; i < n; i++)
sort(a[i],a[i]+k);
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
if(isOk(a[i],a[j]))
vis[i][j] = 1;
else if(isOk(a[j],a[i]))
vis[j][i] = 1;
int Max = 0;
int pos = 0;
for(int i = 0; i < n; i++){
dis[i].o = dfs(i);
dis[i].po = i;
if(dis[i].o > Max){
Max = dis[i].o;
pos = i;
}
}
printf("%d\n",Max+1);
sort(dis,dis+n,cmp);
printf("%d ",pos+1);
int temp = Max-1;
int femp = pos;
for(int i = n-1; i >= 0 && Max >= -1; i--){
if(vis[femp][dis[i].po] && dis[i].o == temp){
printf("%d ",dis[i].po+1);
temp--;
femp = dis[i].po;
}

}
printf("\n");
}
return 0;
}


卡时间注意记忆化搜索,输出也不能太恶心,还可以递归
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: