루오 구에 p1559 선수 최고의 일치 문제

이름

검색 타당성 치기

이 문제는 레이블이지만 나는에 양자 그래프 검색을 발견

그러나 상대적으로 작은 N

폭력은 크게 할 수

단, 80 점

의 가능성과 결합 라인에 종이 컷

즉, 그는이 일치하는 모든 선수의 최대를 기록 할 수 있습니다,

는 i 레이어 시간에 우리의 검색에서

최대 값은 그 뒤에 선수를 추가 할 경우 단어에 발견 된 현재 최적의 솔루션에 비해 여전히 작다

그는 잃게했다

암호:

// 바오 리 
사용법 #include <cstdio> 
사용법 #include <iostream>
 사용하여  네임 스페이스 표준;
CONST의  INT N가 = 30 ;
INT의 N, B, A [N] [N], [N] [N] maxn [N], ANS;
불리언 힘 [N];
하는 int () {판독
     INT S = 0 , w = 1 ;
     CH = getchar가 ();
    반면 (! isdigit에 (CH3)) { 경우 (CH2 == ' - ' ) = w - 1 ; CH = getchar가 ();}
     동안 (isdigit에 (CH3)) {S를가 S * 10+ 채널 - ' 0 ' ; CH = getchar가 ();}
     리턴 S * w; 
} 
공극 DFS ( INT의 DEP, INT w) {
     경우 (DEP> N) = {ANS 맥스 (ANS, w); 반환 } 
     INT의 합 = 0 ;
    위한 ( int로 = DEP를 I 단계; 내가 ++] i가 N = <) 합계 = + maxn [I];
    만약 (+ w 합계 <ANS) ;
    위한 ( int로 I = 1 ; i가 <= N; ++ i가 ) 
         경우 (! 힘 [I]) {
            힘 [i]는  =1 ; 
            DFS (DEP + 1 , w + A [DEP [I] * B의 [I] [DEP]); 
            힘 [I] = 0 ; 
        } 
} 
값 int () {메인 
    N = 판독 ();
    위한 ( int로 I = 1 ; i가 N = <I ++ )
          ( INT J = 1 ; J <= N; J ++ ) 
            이 [I] [J] = 판독 ();
    위한 ( int로 I = 1 난 ++; 나는 <= N )
         에 대해 ( INTJ = 1 ; J <= N; J ++ ) 
            B가 [I] [J] = 판독 ();
    위한 ( int로 난 = 1 ; i가 N = <; I ++ )
          ( INT J = 1 ; J <= N; J ++ ) 
            maxn [I]는 = 최대 (maxn [I], A [i]를 [J] * B의 [ J] [I]); 
    DFS ( 1 , 0 ); 
    COUT << ANS << ENDL;
    반환  0 ; 
}

나는 건강을 기원합니다, 시청 해 주셔서 감사합니다!

추천

출처www.cnblogs.com/yanxiujie/p/11708278.html