これは、の圧力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) -1?0 :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) - 1、0、0)<< ENDL。 45 46 } 47 48 }