[제목] 효과
작업의 연속 $ 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 }