問題
解決
T1。
T2。
F [i] [j]は、j番目の文字の総コストを追加して、元のi番目の文字を使用して、元の文字列を表します。
同時に使用する1つの決定を記録します。
複雑さはO((N + K)* K)です。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型の N = 10005 ; CONST INT = K 55 。 INTのN、K、F [N] [K]、LST [N] [K]。 チャーSTR [N]。 インラインボイド GET(int型のx、int型のY){ 場合(LSTは、[X] [Y] == 1)を取得(X- 1 、Y)。 他の 場合(LST [X] [Y] == 2 ){ 得る(X、Y- 1 )。 printf(" %d個"、X + Y)。 } } インラインボイドDP(){ int型私は、Tは、 memsetの(F、0x3fを、はsizeof (F))。 F [ 0 ] [ 0 ] = 0 。 用(INT A = 1 ; <= N + K; ++ ){ ため(INT J = MAX(0、); J <=分(K); J ++ ){ I = A- J。 T =((%10)== 0 )。 もし(I &&J){ 場合(F [I] [J]> [I-F 1 ] [J] +(T&(STR [I] == ' 1 ' ))){ F [I] [J] = F [I - 1 ] [J] +(T&(STR [I] == ' 1 ' )); LST [I] [J] = 1 。 } であれば(F [I] [J]> F [I] [J- 1 ] + T){ F [I] [J] = F [I] [J- 1 ] + T。 LST [I] [J] = 2 ; } } そう なら(I){ F [I]は[j]は = F [I- 1 ] [J] +(T&(STR [I] == ' 1 ' )); LST [I] [J] = 1 。 } 他{ [I] [j]は、F、F [i]は[J-= 1 ] + Tを、 LST [I] [J] = 2 ; } } } int型 ANS = 0 。 用(INTの J = 1 ; J <= K; J ++ ) であれば(F [N] [ANS]> F [N] [J])ANS = J。 printf(" %d個の\ nを"F [N] [ANS]); のprintf(" %dの"ANS) を取得N(ANS); } int型のmain(){ freopenは(" crew.in " " R 」、STDIN)は、 freopenは(" crew.out "、" W " 、STDOUT); scanf関数(" %d個の%のD "、&N&K); scanf関数(" %sの"、STR + 1 )、 DP(); 戻り0 ; }