Uva103 Stacking Boxes 贪心 深搜 +DP思想

2014-11-24 08:06:40 · 作者: · 浏览: 0

题目勉强可以算是一个DP题目把,贪心部分很好想到,题意是 给你k个n维的 盒子,如果一个盒子的相应的每一维都比另一个盒子的每一维大,就代表这个盒子包含另一个盒子,问给你的k个盒子中最多几个盒子连续包含,而且每一维的位置并不是固定的,是可以自己排序调整的,那么直接应用贪心思想全部从小到大或者从大到小都是可以的,接下来 就是一个 DFS过程了,每找到一个盒子 他能包含另一个盒子时,再往下一层进行寻找,找另一个盒子下面包含的,找到深度最深的那个就是最大连续包含量,同时利用深搜记录下,是哪几个盒子


#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         #include
        
          #include
         
           #include
           #include
           
             #include
            
              #include
             
               #include
              
                #define ll long long #define eps 1e-7 #define inf 0xfffffff const ll INF = 1ll<<61; using namespace std; //vector
               
                 > G; //typedef pair
                
                  P; //vector
                 
                   > ::iterator iter; // //map
                  
                   mp; //map
                   
                    ::iterator p; // vector
                    
                      G[35]; int dp[35],vis[35]; int k,n,ans,maxn; void clear() { for(int i=0;i<=k;i++) G[i].clear(); memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); ans = 0; } int detal(int cur,int pos) { vector
                     
                       &G1=G[cur],&G2=G[pos]; for(int i=0;i
                      
                       maxnum ans:(maxn = cur,maxnum); return dp[cur] = maxnum; } void Printf(int x) { for(int i=1;i<=k;i++) if(dp[i] == dp[x] - 1 && detal(x,i)) { Printf(i); break; } if(x != maxn) printf("%d ",x); else printf("%d",x); } int main() { int x; while(scanf("%d %d",&k,&n)==2) { clear(); for(int i=1;i<=k;i++) { for(int j=0;j