トピックはHDU 2577、切り替え対象のポータル
効果の件名:
Nは今あなたに、大文字と小文字を区別した文字列を与え、ケースはキャップロックとシフトスイッチを使用することができます(学んだコンピュータが知っています)
しかし、もう一つ注意すべきは、(キャップスロックを小文字にスイッチへのシフトと、今であればシフトは、切り替えられました)
この質問はそれだと思うには時間がかかるし始めているN- 2のDP
しかし、伝達方程式は、考え抜かれた(時間がかかり0.25時間)に
そして、後でそれについて考え、それを2N dpの中で発見されました
次にカットに、20分を考えました
問題解決のアイデア:
私たちは、最初の文字列の文字列01を形成し、前処理します
このようなテストデータ:
こんにちは世界
これは、変換することができます。
1110001110
その後、転送の方程式を書くことができます
現在の文字が大文字にした場合、それはこれです:
DP [I] [ 0 ] =分(DP [I- 1 ] [ 0 ] + 1、DP [I- 1 ] [ 1 ] + 1)+ 1 。 DP [I] [ 1 ] =分(DP [I- 1 ] [ 0 ] + 1、DP [I- 1 ] [ 1 ])+ 1。
DP [I] [0]は、i番目の文字を表し、キャップがdp [i]は[1]、がロックされているi番目の文字、無キャップロックを表します
資本を必要とした場合、それはこれです:
DP [I] [ 0 ] =分(DP [I- 1 ] [ 1 ] + 1、DP [I- 1 ] [ 0 ])+ 1 。 DP [I] [ 1 ] =分(DP [I- 1 ] [ 1 ] + 1、DP [I- 1 ] [ 0 ] + 1)+ 1。
(彼らの理解、怒りこんにゃくオンライン虐待の人々を意味)
次のように、ACコードは非常に簡単である(コード繊細奇数ない非難)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 チャー S [ 110 ]。 INT、N、T [ 110 ]、DP [ 110 ] [ 2 ]。 int型のmain() { scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++ ) { memset(T、0、はsizeof (T))。 scanf関数(" %S "、&S)。 int型 L = strlenを(S)。 用(INTは iは= 0 ; I <L、I ++)場合(S [i]が> = 65 && S [i]は<= 90)T [I] = 1。// 预处理 DP [ 0 ] [ 1 ] = 2 ; もし(T [ 0 ] == 1)DP [ 0 ] [ 0 ] = 2 ; 他 DP [ 0 ] [ 0 ] = 1; // 初始化 ため(INT iは= 1 ; I <L、I ++ ) { もし(T [I] == 1 ) { DP [I] [ 0 ] =分(DP [I- 1 ] [ 0 ] + 1、DP [I- 1 ] [ 1 ] + 1)+ 1 。 DP [I] [ 1 ] =分(DP [I- 1 ] [ 0 ] + 1、DP [I- 1 ] [ 1 ])+ 1 。 } 他 { DP [I] [ 0 ] =分(DP [I- 1 ] [ 1 ] + 1、DP [I- 1 ] [ 0 ])+ 1 。 DP [I] [ 1 ] =分(DP [I- 1 ] [ 1 ] + 1、DP [I- 1 ] [ 0 ] + 1)+ 1 。 } // 伝達方程式 } printf(" %D \ N- "、分(DP 1- [ 1 ] [ 0 ]、DP 1- [ 1 ] [ 1 +] 1。 )); // 必要比較 } リターン〜(0 - 0)。// 13の上に置きます }
このように、ACこの質問は簡単にすることができます......
DPの旅を続けることにする.......