DPの問題(1):HDU 2577

トピックは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の旅を続けることにする.......

おすすめ

転載: www.cnblogs.com/juruo-hxy/p/11962510.html