前言
同學找我看看一段不到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...