洛谷P1385 密令 題解 動態規劃

2022-05-19 23:53:19 字數 884 閱讀 1004

題目大意:

給定一小寫字母串s,每次操作你可以選擇乙個p(1<=p<|s|)執行下述修改中的任意乙個:

將s[p]改為其字典序+1的字母,將s[p+1]改為其字典序-1的字母

或將s[p]改為其字典序-1的字母,將s[p+1]改為其字典序+1的字母

在經過任意多次操作後,串s能變化成多少種字串?

修改過程中必須保證s是合法的小寫字母串(即不能對字母『a』進行字典序-1的操作),答案對1000000007(10^9 + 7)取模。

解題思路:

這裡說的 字典序(其實就是ascii碼),

對於乙個字串,可以執行的上述 2 種操作都不會更改字串中所有字元的 ascii 碼總和,所以我們可以定義狀態 \(f[i][j]\) 表示前 \(i\) 個字元中的 ascii碼總和為 \(j\) 的情況下的方案數,則可以得到狀態轉移方程為:

那麼給我們乙個字串 s ,我們只需要知道其長度 n 以及 ascii碼之和(因為都是小寫字母,所以都減去字元 'a' 的 ascii 碼),即 令乙個變數 sum = \(\sum_^ s[i] - 'a'\) (假設字串座標從 1 開始),則總的方案數為 \(f[n][sum]\) ,但是題目問的是合法的轉換,那麼也就是說原始的字串不在考慮之內,所以最終的答案還要減1。

實現**如下:

#include using namespace std;

const long long mod = 1000000007ll;

long long f[101][2610];

string s;

int t, n, sum;

void init()

int main()

return 0;

}

洛谷 1385 密令

給定一小寫字母串s,每次操作你可以選擇乙個p 1 p s 執行下述修改中的任意乙個 將s p 改為其字典序 1的字母,將s p 1 改為其字典序 1的字母 或 2.將s p 改為其字典序 1的字母,將s p 1 改為其字典序 1的字母 在經過任意多次操作後,串s能變化成多少種字串?修改過程中必須保證...

洛谷P1002 過河卒 題解 動態規劃

棋盤上 a 點有乙個過河卒,需要走到目標 b 點。卒行走的規則 可以向下 或者向右。同時在棋盤上cc點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a 點 0,0 b 點 n,m n m 為不超過 20 的整數 同樣馬的位置座標是需要給...

P1044 棧(洛谷) 動態規劃

洛谷傳送門 p1044 這一題是一題很經典的動態規劃。在這裡我們知道,對於已經排到佇列中的元素對剩下的元素的排列種數沒有影響,因此僅需考慮在原佇列中的元素數目i和在棧中的元素數目j。若i為0,則待排元素的排列種數僅有一種,即將棧中的元素全部彈出。若i不為0,則dp i j dp i 1 j 1 從原...