CF543C思い出し文字列状压DP

コード: 

#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
に#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)     
の#define INF(1 << 22)
の#defineは30 MAXN 
名前空間を使用してSTD;    
チャーS [MAXN] [MAXN]。
データは、[MAXN] [MAXN]、共通[MAXN] [MAXN]、B [MAXN] [MAXN]、DP [INF]、N、M INT。
INTメイン(){    
    // setIO( "入力")。    
    scanf関数( "%d個の%のD"、&N、&M)。
    (I 0 = int型、iがN <; ++ i)についてのscanf( "%sの"、S [I])。  
    (; iがN <++ iが0 = INT)のため
        のために(INT J = 0; J <M; ++ j)を
            scanf関数( "%d個"、&データ[I] [J])。
    (I 0 = int型、iがN <; ++ i)のための
        (INT J = 0; J <M。
            ++ J){ int型の和= 0、X = -INF。
            用(int型のk = 0; K <N; ++ K){
                IF(S [k]は[J] == S [I] [J]){ 
    のprintf(」
                    和+ =データ[K] [j]は、X = MAX(X、データ[K] [J])。
                    共通[I] [J] | =(1 << k)は、
                } 
            } 
            [I] [J] =和-X B。
        } 
    のmemset(DP、0x3fを、はsizeof(DP))、DP [0] = 0; 
    INT再=(1個の<< N)。  
    (; iが再<++ iが0 = INT)のための
        (、J <N; INT J = 0 ++ j)のための
            ((I&(1 << J))== 0){場合
                (INT kの= 0; M <K; ++ K){ 
                    DP [I |(1 << J)] =分(DP [I |(1 << J)]、DP [I] +データ[J] [K] );   
                    DP [I |共通[J] [K] =分(DP [I |共通[J] [K]、DP [I] + B [J] [K])。   
                } 
            }
    0を返します。   
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11231113.html