より多くの水、間隔DPを指示
DP [i]の[j]の間隔は明白な答えを表現し、2つの前処理の始まり
移転を考えてみましょう
もし現在のSTR [I] == [J]、および元はパリンドローム最後の段落を形成し、その後に削除されますSTR
STR [i]は!=のStr [j]は、[OK]にブレークポイントを列挙した場合
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長いlong int型 INT [DP 1005 ] [ 1005 ]、N。 文字列strの。 署名された{)(メイン 用(int型 i = 0 ; iは< 1000年 ; ++ I){ ための(int型 J = 0 ; J < 1000年 ; ++ J){ DP [I] [J] = 1000000000 。 } } CIN >> N >> STR。 以下のための(int型私は=0 ; iは= N <; ++ I)DP [i]は[I] = 1 。 以下のために(int型 i = 0 ; iはN- < 1 ; ++ I){ 場合(STR [I] == STR [iが+ 1 ])DPを[I] [I + 1 ] = 1 。 他 DP [I] [I + 1 ] = 2 ; } のための(INT LEN = 3 ; LEN <= N; ++ LEN){ ため(int型 i = 0 ; iがLENを+ <= N; ++ I){ int型 J = + len- 1 。 もし(STR [I] == STR [J])DP [I] [j]はDPを= [I + 1 ] [J- 1 ]。 用(int型、K <J、K = I ++ K){ DP [I] [J] =分(DP [I]、[J]、DP [I] [K] + DP [K + 1 ] [J] ); } } } のprintf(" %LLDする\ n "、DP [ 0 ] [N- 1 ])。 リターン 0 ; }
この質問の複雑さは、ほぼO(N-で考えてみましょう3)は、魔法フロイドを考えます
このタイトルは非常に賢いが、それでも思考の非常によく理解しました
各現在の数の右側の割り当て方法オフダウン検討、最大フロイドを求めるように変更
最後に、何回、各OKに尋ねます
最後に、それも実現可能であるの後ろに、接頭辞を書き留めて、それの前にいるかのようにすることを忘れないでください
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いint型 のconst int型の INFを= 1000000000 ; int型 F N、M、[ 405 ] [ 405 ]、ANS [ 160005 ]。 メイン(){署名付き のscanf(" %のLLDの%のLLD "、&N、&M)を、 以下のために(int型 i = 1 ; iは= N <; ++ I)のために(int型 J = 1 ; J <= N; ++ j)はF [I] [J] = INF。 以下のために(int型 I = 1 ; I <= M; ++I){ int型Uを、V。 scanf関数(" %のLLDの%のLLD "、&U&V); F [U] [V] = I。 } のための(int型のk = 1 ; kは<= N; ++ K)のための(int型 i = 1 ; iが<= N; ++ I){ 場合(I == k)を続けます。 用(INT J = 1 ++; J <= N {j)の 場合(jは== iがj個の== kは||)続けます。 F [I] [J] = 分(最大[K] [J])F(F [i]が[K]、[I] [J] F)。 } } のために(int型 i = 1 ; iが<= N; ++ I){ ため(INT J = 1 ++; J <= N {j)の 場合は [F(F [I] [J] = INF!)ANS I] [J]] ++ ; } } のために(int型 I = 1 ; I <= M; ++ I){ ANS [I] + = ANS [I- 1 ]。 printf(" %のLLD " 、ANS [I])。 } 戻り 0 。 }
もっと楽しく、この質問を考え、通常は行われない(通常であると考え、PMT、GH、デュ神、神にそのバーqwqのリーダー)
カンカンデータ範囲:10 。6を !!!
一見感は数学ですが、数学は1E6をn個でしたか???
そして、それについて考える、O(n)の練習は、失敗しました
PMTが言ったことで、突然光を参照してください!!!txdy PMT!!!
元のビルドDPI、各番号は、いくつかの数であり得る%のN、検討