題目大意:
給定一小寫字母串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 從原...