コード:
#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#define N 3003 の#defineっ長い長 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 使用して名前空間std。 文字列str [N]。 INT S [N]、T [N]、D [6] [6]、N、M。 LL F [N] [N]、G [N] [N]、H [N] [N]。 INTのID(チャーC) { IF(C == 'A')リターン1。 IF(C == 'T')リターン2。 IF(C == 'G')リターン3。 (C == 'C')リターン4であれば、 } int型のmain() { // setIO( "入力")。 int型I、J、A、B; scanf関数( "%sの"、STR + 1)、 (I = 1; iが<= N。 scanf関数( "%s"は、STR + 1)、M = STRLEN(STR + 1)。 用(i = 1; I <= M; ++ I)T [I] = ID(STR [I])。 用(i = 1; iが<= 4; ++ I) { ため(J = 1; J <= 4; ++ j)はscanf関数( "%のD"、&D [i]は[J])。 } のscanf( "%D%dの"、&A、&B); memsetの(F、-63、はsizeof(F))、memsetの(G、-63、はsizeof(G))、memsetの(時間、-63、はsizeof(H))。 G [1] [0] = hを[0] [1] = - A、F [0] [0] = 0; 用(i = 1; iは= N <; ++ I) { ため(J = 1; J <= M; ++ J) { F [I] [J] = MAX(F [iが- 1] [J - 1]、MAX(G [I - 1] [J - 1]、H [I - 1] [J - 1]))+ D [S [I] [T [J]。 G [I] [J] = MAX(MAX(F [I - 1] [J]、H [I - 1] [J]) - A、G [I - 1]〜[J] - B)。 H [i]は[J] = MAX(MAX(F [I] [J - 1]、G [i]は[J - 1]) - A、H [I] [J - 1] - B)。 } } のprintf( "%LLDする\ n"、MAX(MAX(F [n]は[M]、G [n]は[M])、H [n]は[M]))。 0を返します。 }