1. 程式人生 > >hiho一下 第221周 Push Button II

hiho一下 第221周 Push Button II

題意:

上一週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]); } }