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 ...