??本來很久以前就打算每天練一道動態規劃題的,但每每由于作業太多而中斷,現在終于停課了......廢話不多說,第一道題就給了我迎頭一棒,不僅想了很久,連題解都看了很久。。。水平相當不足啊啊,不多說廢話,先上題吧。
? ?題目大意:給你一個只包含數字的字符串,讓你在中間添加k個乘號,使得添加完后的字串按乘號劃分出的k+1個部分相乘,除以一個定值s的余數為指定的值,在這種約束下,最小化k的值。
? ?輸入:第一行一個數字串,第二行一個數s。
? ?輸出:最小的k值。
? ?數值范圍:數字串長度L<=1000,s<=50。
? ?思路:首先想到“乘積最大”這道題目,在“乘積最大”中,令f[i][j]為前i個數添加j個乘號所獲得的最大值,則有:f[i][j]=max{f[i-k][j-1]*S[k+1][i],f[i][j]}。但是在這道題中,我們看到要對結果取模,因此必須轉換思路。
??由于題目是判斷存在性的類型。我們令f[i][j]為前i個字符得到除以s的余數為j,令S[i][j]為數字串從第i位到第j位組成的數除以s的余數,則f[i+1][(j*S[k+1][i+1]) mod s]=min{f[k][j]+1};至此,動態轉移方程已經出爐,由于各種原因,筆者的代碼已經遺失,因此就不貼代碼了,各位自行腦補......