コード:
#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を返します。 }