검색 타당성 치기
이 문제는 레이블이지만 나는에 양자 그래프 검색을 발견
그러나 상대적으로 작은 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 ; }
나는 건강을 기원합니다, 시청 해 주셔서 감사합니다!