このシーケンスは、十分なので、直接DP、セクションに分け$ 2K-1 $の最大値になります$ K $回を染めます見つけます
#include <ビット/ STDC ++ H> に#define N 100004 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 INT A [N]、F [N] [104] [2]。 INTのmain() { int型N、K、I、J。 // setIO( "入力"); scanf関数( "%d個の%のD"、&N&K)。 K = K * 2-1。 用(i = 1; iは= N <; ++ I)のscanf( "%dを" &A [I])。 int型ANS = 0、P。 用(i = 1; iは= N <; ++ I) { ため(J = 1; J <= K; ++ j)は { IF([I] == 0) { F [I] [J] [0] = MAX(F [I-1] [J-1] [1] +1、F [I-1] [j] [0] +1)。 F [I] [j]を[1] = F [I-1]〜[J] [1]。 F [I] [j]を[0] = F [I-1] [j] [0]。 F [I] [J] [1] = MAX(F [I-1] [J-1] [0] +1、F [I-1]を[J] [1] +1)。 } ANS = MAX(ANS、F [i]は[J] [0])。 ANS = MAX(ANS、F [i]は[J] [1])。 } } のprintf( "%d個の\ n"、ANS)。 0を返します。 }