CodeCraft-20(DIV。2)E(圧力DPのような)

1  の#define HAVE_STRUCT_TIMESPEC
 2の#include <ビット/ STDC ++ H>
 3  使用して 名前空間STDを、
4のtypedef 構造体ノード{
 5      INT ヴァル。
6      INT W [ 10 ]。
7  } SRT。
8 SRT [ 100007 ]。
9  ブールCMP(SRT A、SRT B){
 10      リターン a.val> b.val。
11  }
 12  長い 長い DP [ 100007 ] [ 130 ]。
13  int型のmain(){
14の      IOS :: sync_with_stdio();
15      cin.tie(NULL)。
16      cout.tie(NULL)。
17      INT N、P、KK。
18      CIN >> N >> P >> KK。
19      のためにINT iは= 1 ; iが<= N; ++ I)
 20          CIN >> [I] .val。
21      のためにINT iは= 1 ; iが<= N; ++ I)
 22          のためのINT J = 1 ; J <= P; ++ j)は
 23              CIN >> [I] .W [J- 1 ]。
24     ソート(A + 1、A + 1 +、N-、CMP); // 降順寄与チアリーダーに従って、後ろのみ選手チームメンバーとして、特定のチアリーダーのP + KKは前にいずれかを生成するので
25      のmemset(DP 、0xCFはsizeof(DP)); //は、未処理状態の最小値ので、小さな負の数に初期化
26である      DP [ 0 ] [ 0 ] = 0 ;
 27      INT I = 1 ; I <= N; ++ I){
 28          のためにINT J = 0 ; J < 1。 << P; ++ J){
 29              のためにINT K = 0、K <P; ++K)
 30                  IF(J&(1 << K))// iはk番目の位置を埋める人
31は                      DP [I] [J] = MAX(DP [I]、[J]、DP [I- 1 ] [J ^(1。 I] .W [K] + A [)<< K); //は、最大更新
32を             INT MX = I- 1。 ; // 番号チアリーダーを持っている
33がある             ためint型 K = 0 ; K <P; ++ K)
 34は、                 IF(J&(1 << K))
 35                      MX; // のようないくつかのチームメンバー
36              IF(MX <KK)// オープン依然としてチアリーディング
37                 DP [I] [J] = MAX(DP [I]、[J]、DP [I- 1 ] [J] + A [I] .val); // の最大値更新
38が             他の
39                  DP [I] [J = MAX(DP [I]、[J]、DP [I- 1 ] [J]); //が押し戻さ
40          }
 41である     }
 42は      COUT << DP [N-] [(1 << P) - 1 ] 、
 43である     戻り 0 ;
 44れます }

 

おすすめ

転載: www.cnblogs.com/ldudxy/p/12426162.html