簡單dp的狀態轉移方程集合

2022-06-03 16:54:10 字數 979 閱讀 4634

1.對於任一種n的排列a,定義它的e值為序列中滿足a[i]>i的數的個數。給定n和k(k<=n<=1000),問n的排列中e值為k的個數。

dp[i][j]表示i個數的排列中e值為j的個數。假設現在已有乙個e值為j的i的排列,對於新加入的乙個數i+1,將其加入排列的方法有三:1)把它 放最後,加入後e值不變    2)把它和乙個滿足a[k]>k的數交換,交換後e值不變       3)把它和乙個不滿足a[k]>k的數交換,交換後e值+1      根據這三種方法得到轉移方程dp[i][j] = dp[i - 1][j] + dp[i - 1][j] * j + dp[i - 1][j - 1] * (i - j);

2.

給定乙個2*n的矩形,求把這個矩形分割為k部分的方法,且對稱的切割方法視為不同,輸出時模上100000007。

(1<=n<=1000,1<=k<=2*n)

解法:看到這個題目,很容易想到dp。

狀態表示 f[i][0][j]:前i行已經出現了j部分且第i行的兩個格仔屬於同一部分的方法數

f[i][1][j]:前i行已經出現了j部分且第i行的兩個格仔屬於不同部分的方法數

初始條件 f[1][0][1]=f[1][1][2]=1

狀態轉移 f[i+1][0][j]=(f[i+1][0][j]+f[i][0][j]+f[i][1][j]*2)%mod;

f[i+1][0][j+1]=(f[i+1][0][j+1]+f[i][0][j]+f[i][1][j])%mod;

f[i+1][1][j]=(f[i+1][1][j]+f[i][1][j])%mod;

f[i+1][1][j+1]=(f[i+1][1][j+1]+f[i][0][j]*2+f[i][1][j]*2)%mod;

f[i+1][1][j+2]=(f[i+1][1][j+2]+f[i][0][j]+f[i][1][j])%mod;

3.順著dp不好推時,可以先dp不符合的情況

DP問題各種模型的狀態轉移方程

1 最長公共子串 注意和最長公共子串行區別 兩個字串str1和str2,長度分別為 l1,l2 dp i j 表示以兩個字串分別以第i和第j個字元結尾所能達到的公共子串行的長度,由於下面涉及到i 1和j 1,那麼這個時候我們一般從i 1和j 1開始到i len1,j len2。if str i 1 ...

DP問題各種模型的狀態轉移方程

原帖位址 1 最長公共子串 注意和最長公共子串行區別 兩個字串str1和str2,長度分別為 l1,l2 dp i j 表示以兩個字串分別以第i和第j個字元結尾所能達到的公共子串行的長度,由於下面涉及到i 1和j 1,那麼這個時候我們一般從i 1和j 1開始到i len1,j len2。if str...

DP問題各種模型的狀態轉移方程

1 最長公共子串 注意和最長公共子串行區別 兩個字串str1和str2,長度分別為 l1,l2 dp i j 表示以兩個字串分別以第i和第j個字元結尾所能達到的公共子串行的長度,由於下面涉及到i 1和j 1,那麼這個時候我們一般從i 1和j 1開始到i len1,j len2。if str i 1 ...