【19.9.23】NOIP2017模擬試験

問題

解決

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]。
インラインボイド GETint型の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 ; 
}

     

 

おすすめ

転載: www.cnblogs.com/jian-song/p/11587204.html