문제 보고서에 HDU1158 고용 계획 솔루션

주제 포털

[제목] 효과

작업의 연속 $ n 개의 $ 달에, 내가 개월 $ 최초의 $가 $ num_i의 최소 요구 $ 노동자, 고용 및 해고 노동자는 고정 수수료 $ H는 $ 및 $ F $으로해야하고, 유무에 관계없이 근로자의 고용 상태 작업은 최소한의 필요 비용을 얼마나 물어, 임금에게 $ C 형 $를 지불해야합니다.

[분석] 아이디어

분명히 그것은 DP의 주제입니다! 설정 $의 DP [I] [J]를 $ $ 내가 전송하는 동안 다른 상황에 더 많은 사람들이 화재 사람들을 고용할지 여부를 고려, $ J의 $ 노동자 필요한 총 비용의 첫 번째 개월로 표현 $.

[I-1] [K] $ DP $ 들어 :

1. 만약 $ j를 \ 르 케이 $, 중복 노동자, 즉 해고

$$ DP [I] [J] = 분 (DP [I] [J], (DP) [I-1] [K] + J * C 형 + (KJ) * F) $$

2. $의 J> K $으로, 그 고용하는 경우 추가로 근로자

$$ DP가 [I]는 [j]가 분 = (DP [I] [J], DP를 [I-1] [K] + J * C 형 + (JK) * H) $$

초기 값 : $의 DP [1] [내가] = I *를 (H +의 온도) $ 대차 + $ \ infty $으로

답 : 최대 $ \ {DP [n]은 [I]는 \} (난에 \ [num_n 맥스 \ {NUM의 \}]) $

[] 코드 구현

1 #INCLUDE <cstdio>
 2 #INCLUDE <iostream>
 3 #INCLUDE <CString을>
 4 #INCLUDE <알고리즘>
 5 #INCLUDE <cmath>
 6  #DEFINE g () getchar가 ()
 7  #DEFINE RG 레지스터
 8  #DEFINE의 이동 (I A는, b) (RG의 인터넷 용 난 =; 나는 <= B를 단계; 내가 ++)
 9  #DEFINE 백 (나는 A는 b) (RG의 인터넷 용 난 =; I> = B, 난 -)
 10  # 정의 DB 이중
 11  #DEFINE 줄게 긴 길이
 12  #DEFINE의 IL 인라인
 13  #DEFINE PF printf의
 14  이용한  스페이스 성병;
(15) INT의 FR () {
 16      INT w = 0 , Q = 1 ;
17       CH = g ();
18 일      동안 (CH2 < ' 0 ' || CH> ' 9 ' ) {
 19 일          경우 (CH2 == ' - ' ) Q = - 1 ;
20          CH = g ();
21      }
 22      동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) = w (w << 1 ) + (w <<0 ' , CH = g ()를;
23       * w의 Q;
24  }
 25  INT의 N, A, B, C, DP [ 15 ] [ 10002 ], NUM [ 15 ];
26  CONST의  INT의 INF 1E9 + = 7 ;
27  INT 의 main () {
 28      // freopen을 ( "", "R", 표준 입력);
29      // freopen을 ( "", ""w, 표준 출력); 
(30)      N =의 FR ();
31 일      동안 (N) {
 32          A = FR의 () = B의 FR () = C를 FR ();
33          RG INT maxn =0 ;
34          이동 (I, 1 , N) NUM [I]의 FR = () maxn = 최대 (maxn, NUM [I]);
35          이동 (I, 1 , maxn) DP [ 1 ] [내가] = I *는 (a + b);
36          이동 (I, 2 , N)의 이동 (j, NUM [I] maxn) {
 37                  DP [I] [J] = INF;
38                  이동 (K, NUM [I- 1 ] maxn) {
 39                      의 RG INT는 = J *의 추가의 B 단계;
(40)                      만약 (j <k)를 추가 + = (KJ) * C;
41                      다른 추가 + = (JK) * a 및
(42)                     DP는 [I] [J]를 분 (DP [I] [J], DP [I- = 1 ] [K] + 추가)를;
43                  }
 44          }
 45          RG INT ANS = INF;
46          이동 (I, NUM [N] maxn) ANS = 분 (ANS, DP [n]은 [I]);
47          PF ( " % D \ 없음 " , ANS);
(48)          N =의 FR ();
49      }
 50      반환  0 ;
51 }
코드는 여기 찌를

추천

출처www.cnblogs.com/THWZF/p/11390619.html