動態規劃法之移位解碼問題

2021-07-06 07:58:22 字數 1563 閱讀 9858

前言

同學找我看看一段不到90行的**,我從下午2點多收到**,但是直到6點多才完全看懂。可能因為之前沒有看題目就直接看**,所以直接上手就比較痛苦,花的時間也就比較長了。(自我安慰中%>_<%)

題目描述

題目是一道acm題,當時看的時候只有15%的通過率,所以也屬於比較難的題目了。

題目的意思大概意思是:移位密碼是一種將訊息中的每個字元都轉換為其他的字元,按照相應的規律。如果有整數k=3,那麼字串 「we will meet at midnight」 將加密為 「zhzloophhwdwplgqljkw」,也就是向後移三位,按照這樣的規律。

先輸入一定數量的單詞作為字典,然後輸入一段表示密文的字串。根據字串來解析得到單詞,得到的單詞都在開始輸入的字典裡面,結果輸出根據密文字串得到的最少單詞。

具體的要求大家可以去檢視,這裡我就不在贅述了。《題目鏈結》

原始碼參考

# include 

# include

# include

# include

# include

# include

# include

# include

using

namespace

std ;

const

int max = 1e9 ;

string t ;

int cnt , len ;

string ss [ 100000 ] ;

map< string , int > mmap ;

vector

< int > vec ;

int stmin ; //表示單詞數最少的一種情況

int k ;

int ansk ;//表示密碼採用的k值

void dp ( ) ;

int num [ 300 ] = ;

int dp [ 300 ] = ;

memset ( dp , -1 , sizeof ( dp ) ) ;

dp [ 0 ] = 0 ;

for ( int i = 1 ; i <= len ; i ++ )

if ( dp [ j ] != -1 && dp [ j ] + 1

< minn ) }}

if ( minn != max )

}if ( dp [ len ] != -1 && dp [ len ] < stmin && len > dp [ len ] * 2 )

}}int main ( )

//輸入單詞

while ( getline ( cin , t ) , t [ 0 ] != '0' ) //講k值從0到25迴圈判斷

}if ( stmin == max ) cout

<< "no solutions"

<< endl ;

else

cout

<< endl ;}}

}

動態規劃法

在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...

動態規劃法

有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...

動態規劃法

最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...