hiho一下 第221周 Push Button II
阿新 • • 發佈:2018-12-11
題意:
上一週Pushbutton I題目連結 修改版,輸入n範圍變成1000,問滿足條件的數量,不要求輸出搜尋過程。那麼這題從搜尋題變成常見動態規劃問題。定義dp[i][j]表示i個數分成j組的數量。
遞推式是什麼呢?簡單思考一下:
舉例 dp[3][2]
情況有 : 可以從dp[2][1] :1 2
加一個分組 3成為1 2 -3
或者dp[2][2]: 1-2 or 2-1
加入3 成為 1-23 or 2-13
。再仔細思考發現, 這裡面每個分組的順序都可以和新的分組交換形成新的可能比如:12-3
中 12和 3交換一下 3-12
又是一個新的序列。
所以遞推式是: dp[i][j] = dp[i-1][j-1]*j + dp[i-1][j]*j
最後注意計算中間過程會溢位,需要取long long 。
樣例:
樣例輸入 3 樣例輸出 13
思路:
#include<bits/stdc++.h> using namespace std; const int maxn = 1010,mod = 1000000007; long long dp[maxn][maxn]; long long sum[maxn]; void init(){ memset(dp,0,sizeof(dp)); dp[1][1] = 1; for(int i=2;i<=1000;i++){ for(int j=1;j<=i;j++){ dp[
i][j] = (j*dp[i-1][j-1]%mod + j*dp[i-1][j]%mod)%mod; } } for(int i=1;i<=1000;i++){ sum[i] = 0; for(int j=1;j<=i;j++){ sum[i] = (sum[i] + dp[i][j])%mod; } } } int main(){ int n; init(); while(~scanf("%d",&n)){ printf("%d\n",sum[n]); } }