pku 1691 Painting A Board 状态压缩DP

pku 1691 Painting A Board 状态压缩DP

 

#include  < stdio.h >
#include 
< stdlib.h >
#include 
< string .h >

int   const  inf =   1 << 29 ;
int  n;
struct  Point {
    
int  Lx, Ly, Rx, Ry;
}
;

Point pnt[
16 ];
int   need[ 16 ], dp[ 1 << 15 ][ 15 ], color[ 16 ];

void  init() {
    
for int  i =   0 ; i <=  n;  ++ i ) need[i] =   0 ;
    
    
for int  i =   0 ; i <  n;  ++ i ) {
        
for ( int  j =   0 ; j <  n;  ++ j ) {
            
if ( i ==  j )  continue ;

            
if ( pnt[j].Ry <=  pnt[i].Ly  &&  pnt[j].Lx <  pnt[i].Rx ) {
                need[i]
|=  ( 1 << j);
            }

        }

    }

}


void  solve() {
    
for int  i =   0 ; i <  ( 1 << n);  ++ i )
        
for ( int  j =   0 ; j <  n;  ++ j ) dp[i][j] =  inf;

    dp[
0 ][ 0 ] =   0 ;
    
for int  i =   0 ; i <  n;  ++ i )
        
if ( need[i] ==   0  ) dp[ 1 << i][i] =   1 ;
    
    
for int  s =   0 ; s <  ( 1 << n);  ++ s ) {
        
for int  i =   0 ; i <  n;  ++ i ) {
            
if ( ( s &  ( 1 << i) ) ==   0  )  continue ;

            
for int  j =   0 ; j <  n;  ++ j ) {
                
if ( s &  ( 1 << j) )  continue ;
                
if ( (s &  need[j]) !=  need[j] )  continue ;

                
if ( dp[s][i] +  ( color[i] !=  color[j] ) <  dp[s | ( 1 << j)][j] ) {
                    dp[s
| ( 1 << j)][j] =  dp[s][i] +  ( color[i] !=  color[j] );
                }

            }

        }

    }


    
int  ans =  inf;
    
for int  i =   0 ; i <  n;  ++ i )
        
if ( dp[( 1 << n) - 1 ][i] <  ans ) ans =  dp[( 1 << n) - 1 ][i];

    printf(
" %d\n " , ans );
}


int  main() {
    
int  test;
    scanf(
" %d " , & test );

    
while ( test --  ) {
        scanf(
" %d " , & n );

        
for int  i =   0 ; i <  n;  ++ i ) {
            scanf(
" %d%d%d%d " & pnt[i].Ly,  & pnt[i].Lx,  & pnt[i].Ry,   & pnt[i].Rx );
            scanf(
" %d " , color +  i );
        }


        init();
        solve();
    }

    
    
return   0 ;
}

你可能感兴趣的:(pku 1691 Painting A Board 状态压缩DP)