hdu 4301 - Divide Chocolate(簡單dp)


題目:

Divide Chocolate


題意:

將一塊n*2的巧克力分成k份的不同分法總數,對稱視爲不同種


思路:

一列一列地枚舉情況:

dp[i][j][state] : 表示將i * 2的巧克力分成j塊 , 其中 state = 1表示最後的一列是被分割的狀態, state=0表示最後的一列是連起來的狀態


則舉例如下狀況:dp[i-1][j][0] , 前i-1列被分成了j塊,其中的最後一列( i -1 列)是連起來的,現在要將當前列的巧克力整合上去,由於已經有j塊了,不能再增加,故不論是割開還是不割開,只能一起粘上去。

其餘情況類推


代碼:

//#pragma comment(linker, "/STACK:102400000,102400000")
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 522133279;
const int MAXN = 1000000+100;
#define eps 1e-14
const int mod = 100000007;

LL dp[1010][2010][2];

int main()
{

    //freopen("in","r",stdin);
    //freopen("out","w",stdout);

    int t;
    scanf("%d",&t);

    dp[1][1][0] = 1;
    dp[1][2][1] = 1;

    for(int i = 2 ; i <= 1000 ; i++)
        for(int j = 1 ; j <= i*2 ; j++)
        {
            dp[i][j][0] = (dp[i-1][j][0] + 2*dp[i-1][j][1] + dp[i-1][j-1][1] + dp[i-1][j-1][0]) %mod;
            dp[i][j][1] = (dp[i-1][j][1] + dp[i-1][j-2][0] + dp[i-1][j-2][1] + 2*dp[i-1][j-1][0] + 2*dp[i-1][j-1][1]) % mod;
        }

    for(int ka = 1 ; ka <= t ; ka++)
    {
        int n,k;
        scanf("%d%d",&n,&k);

        printf("%lld\n" , (dp[n][k][0] + dp[n][k][1])%mod);
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章