Topcoer SRM 453.5

一直没写,补上上次的srm~

250pt

500pt 队列BFS

Code Snippet
template < class T > void getMin ( T & a , T b ){ if ( b < a ) a = b ;}
template < class T > void getMax ( T & a , T b ){ if ( b > a ) a = b ;}
#define REP ( i , n ) for ( int i = 0 ; i < ( n ); ++ i )
#define inf 98765432
int mp [ 55 ][ 55 ];
struct node{
     int c ;
     int r ;
     int value ;
     node ( int rr , int cc , int vv ): r ( rr ), c ( cc ), value ( vv ){}
};
class MazeMaker
{
         public :
         int longestPath ( vector < string > maze , int sRow , int sCol , vector < int > mRow , vector < int > mCol )
         {
                 int R = maze . size ();
                 int C = maze [ 0 ]. size ();
                 REP ( i , R ) REP ( j , C ) mp [ i ][ j ]= inf ;
                 deque < node > q ;
                 q . push_back ( node ( sRow , sCol , 0 ));
                 while (! q . empty ()){
                     node now = q . front ();
                     q . pop_front ();
                     int r = now . r ; int c = now . c ; int v = now . value ;
                     if ( mp [ r ][ c ]!= inf ) continue ;
                     mp [ r ][ c ]= v ;
                     for ( int i = 0 ; i < mRow . size (); i ++){
                         int nr = r + mRow [ i ]; int nc = c + mCol [ i ];
                         if ( nr < 0 || nr >= R || nc < 0 || nc >= C || mp [ nr ][ nc ]!= inf || maze [ nr ][ nc ]== 'X' ) continue ;
                         q . push_back ( node ( nr , nc , v + 1 ));
                     }
                 }
                 int res =- 1 ;
                 REP ( i , R ) REP ( j , C ){
                     if ( maze [ i ][ j ]== '.' ){
                         if ( mp [ i ][ j ] == inf ) return - 1 ;
                         if ( mp [ i ][ j ]> res ) res = mp [ i ][ j ];
                     }
                 }
                 return res ;
         }

DFS也可以

VS mp;
VI mR,mC;int N,R,C; 
int used[55][55];
void DFS(int r,int c,int len){
    REP(i,mR.size()){
        int nr=r+mR[i];int nc=c+mC[i];
        if(nr<0||nr>=R||nc<0||nc>=C||mp[nr][nc]=='X')continue;
        if(used[nr][nc]<=len+1)continue;
        used[nr][nc]=len+1;
        DFS(nr,nc,len+1);
    }
}
class MazeMaker
{
        public:
        int longestPath(vector <string> maze, int sRow, int sCol, vector <int> moveRow, vector <int> moveCol)
        {
                mR=moveRow;mC=moveCol;mp=maze;
                R=maze.size();C=maze[0].size();
                REP(i,R)REP(j,C)used[i][j]=inf;
                used[sRow][sCol]=0;
                DFS(sRow,sCol,0);
                int res=-1;
                REP(i,R)REP(j,C){
                    if(mp[i][j]=='.'){
                        if(used[i][j]==inf)return -1;
                        if(used[i][j]>res)res=used[i][j];
                    }
                }
                return res;
        }

1000pt

实际为求从中取出K个数字,连续两个间的序号差不能大于maxDist 求能够求得的最大乘积

由于有负数的存在,最大数字的取得可能是最大的乘以最大的,或者最大的乘以最小的(正 负相乘)

因此要保存到每一个数为止,作为第k个数,取得的最大最小值,dp求解之

 

Code Snippet
typedef long long int64 ;   

template < class T > void getMin ( T & a , T b ){ if ( b < a ) a = b ;}
template < class T > void getMax ( T & a , T b ){ if ( b > a ) a = b ;}
#define REP ( i , n ) for ( int i = 0 ; i < ( n ); ++ i )
int64 dp [ 55 ][ 55 ][ 2 ]; //µÚ¼¸¸ö£¬ÓÃÁ˼¸¸ö£¬Õý»¹ÊǸº;
#define inf 133
class TheProduct
{
         public :
         long long maxProduct ( vector < int > infm , int _K , int maxD )
         {
             int N = infm . size ();
             memset ( dp ,- 1 , sizeof (- 1 ));
             REP ( i , N ) REP ( j , 51 ) REP ( c , 2 ) dp [ i ][ j ][ c ]= inf ;
             REP ( i , N )   dp [ i ][ 0 ][ 0 ]= dp [ i ][ 0 ][ 1 ]=( int64 ) infm [ i ];
            
             for ( int i = 0 ; i < N ; i ++)
                 for ( int j = i - 1 ; i - j <= maxD && j >= 0 ; j --)
                     for ( int z = 0 ; z < _K ; z ++){
                         if ( dp [ j ][ z ][ 0 ]!= inf ){
                             if ( dp [ i ][ z + 1 ][ 0 ]== inf || dp [ j ][ z ][ 0 ]* infm [ i ]< dp [ i ][ z + 1 ][ 0 ]) dp [ i ][ z + 1 ][ 0 ]= dp [ j ][ z ][ 0 ]* infm [ i ];
                             if ( dp [ i ][ z + 1 ][ 1 ]== inf || dp [ j ][ z ][ 0 ]* infm [ i ]> dp [ i ][ z + 1 ][ 1 ]) dp [ i ][ z + 1 ][ 1 ]= dp [ j ][ z ][ 0 ]* infm [ i ];
                         }
                         if ( dp [ j ][ z ][ 1 ]!= inf ){
                             if ( dp [ i ][ z + 1 ][ 0 ]== inf || dp [ j ][ z ][ 1 ]* infm [ i ]< dp [ i ][ z + 1 ][ 0 ]) dp [ i ][ z + 1 ][ 0 ]= dp [ j ][ z ][ 1 ]* infm [ i ];
                             if ( dp [ i ][ z + 1 ][ 1 ]== inf || dp [ j ][ z ][ 1 ]* infm [ i ]> dp [ i ][ z + 1 ][ 1 ]) dp [ i ][ z + 1 ][ 1 ]= dp [ j ][ z ][ 1 ]* infm [ i ];
                         }
                     }
             int64 res =-( 1LL << 63 );
             REP ( i , N ){
                 if ( dp [ i ][ _K - 1 ][ 1 ]!= inf )
                  getMax ( res , dp [ i ][ _K - 1 ][ 1 ]);    
             }
             return res ;
         }

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Topcoer SRM 453.5)