2013年10月10日 星期四

UVA-103

UVA-103   Stacking Boxes

這題要注意題意
當兩個邊重疊時也不能算喔
筆者就卡這個卡了一小時多...

#include<iostream>
#include<stdio.h>
#include<algorithm>
int box[31][10],temp[10];
int b,d;
int ans,ansb[31][31],order[31]={0};
int tempb[31],rm;
bool st(int a,int w){
    for(int q=0;q<d;q++)
        if(box[a][q]!=box[w][q])
            return box[a][q]<box[w][q];
    return true;
} 
bool check(int i,int j){
    bool FT=true;
    for(int k=0;k<d;k++)
        if(box[i][k]>=box[j][k]){
            FT=false;
            break;
        }
    return FT;    
}
using namespace std;
int main(){
    while(scanf("%d%d",&b,&d)!=EOF){
        for(int i=1;i<=b;i++){
            order[i]=i;
            for(int j=0;j<d;j++)
                cin>>temp[j];
            sort(temp,temp+d);
            for(int j=0;j<d;j++)
                box[i][j]=temp[j];
        }
        sort(order+1,order+1+b,st);
        ansb[order[1]][0]=order[1];tempb[order[1]]=1;
        for(int i=2;i<=b;i++){
            ansb[order[i]][0]=order[i];tempb[order[i]]=i;
            int max=0;
            for(int j=i-1;j>0;j--)
                if(check(order[j],order[i]))
                    if(tempb[order[j]]>max){
                        rm=j;
                        max=tempb[order[j]];
                    }
            tempb[order[i]]=max+1;
            for(int j=0;j<max;j++)
                ansb[order[i]][j]=ansb[order[rm]][j];
            ansb[order[i]][max]=order[i];
        }
        int mem=1;
        for(int i=2;i<=b;i++)
            mem=(tempb[order[mem]]>tempb[order[i]])?(mem):(i);    
        cout<<tempb[order[mem]]<<'\n';
        for(int i=0;i<tempb[order[mem]];i++)
            printf("%d ",ansb[order[mem]][i]);
        cout<<endl;
    }
return 0;    
}


2 則留言:

TEST