UVA-10817

これは、の圧力DPのような最初の質問で話題のリンク

Dとの[I] [S1] [ S2] 件名、S2教示2つの科目を教えるS1、Iに個体を表します。 1つの#include <ビット/ STDC ++ H.>  2 使用して 名前空間STD。

3  // の#define IOS ios_base :: sync_with_stdio(0); cin.tie(0)。
4  の#define INF 1000000000
 5  INT N、M、S、X。
6  INT C [ 130 ]、ST [ 130 ]。
7  INT D [ 130 ] [ 1 << 8 ] [ 1 << 8 ]。
8  INT DP(INT I、INT S0、INT S1、INT S2){
 9      もし(I == M + N){ リターン   S2 ==(1 << S) -10 :INF。}
 10      INT&ANS = D [i]は[S1] [S2]。
11      であれば(ANS> = 0戻りANS。
12      // IF(D [i]は[S1] [S2])戻りD [i]は[S1] [S2]。
13      // INT ANS =&D [i]は[S1] [S2]。
14      ANS = INF。
15      もし(I> = M)
 16          ANS = DP(I + 1 、S0、S1、S2); //不选iは
//下面是选I的操作
17 INT M0 = ST [i]が&S0。 18 S0 ^ = M0。 19 int型 M1 = ST [i]は&S1; 20の S2 | = M1; 21 S1 =(S1 ^ M1)| M0; 22 ANS =分(ANS、DP(I + 1、S0、S1、S2)+ C [I])。 23の リターンANS; 24 } 25 のint main()の 26 { 27 // IOS。 28 文字列のライン。 29 一方(のgetline(CIN、ライン)){ 30 のmemset(ST、0はsizeof (ST))。 31 にstringstreamのSS(ライン) 32 SS >> S >> M >> N。 33 もし(S == 0ブレーク34 STR。 35 のためにINT iは= 0 ; iは<m + nは、I ++ ){ 36 のgetline(CIN、STR)。 37 にstringstreamのSS(STR)。 38の SS >> C [i]は、 39 一方(SS >> X){ 40 ST [I] | =(1 <<(X - 1 ))。 41 } 42 } 43 のmemset(D、 - 1はsizeof(D))。 44 COUT << DP(0、(1 << S) - 100)<< ENDL。 45 46 } 47 48 }

 

おすすめ

転載: www.cnblogs.com/jrjxt/p/12288609.html