hdu 4301 Divide Chocolate

来源:互联网 发布:win2008搭建域名服务器 编辑:程序博客网 时间:2024/05/02 19:32

题目:hdu 4301 Divide Chocolate

题意:2*n的巧克力分成k份的方案数

思路:跟铺砖的是一样的

用dp[i][j][k]表示前i-1列已经处理好了,i列切成j块,k=0表示第i列两块属于同一部分,k=1表示第i列两块不属于同一部分。

这里列出第i+1列和第i列的状态,用数字区别不同




#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;#define mod 100000007#define maxn 1010int dp[maxn][2030][2];int main(){    memset(dp,0,sizeof(dp));    dp[1][1][0]=1;    dp[1][1][1]=0;    dp[1][2][1]=1;    dp[1][2][0]=0;    for(int i=2;i<maxn;i++)    {        for(int j=1;j<2*maxn;j++)        {            dp[i][j][0]=(dp[i-1][j][0]+2*dp[i-1][j][1]+dp[i-1][j-1][0]+dp[i-1][j-1][1])%mod;            if(j>=2)                dp[i][j][1]=(2*dp[i-1][j-1][0]+dp[i-1][j][1]+2*dp[i-1][j-1][1]+dp[i-1][j-2][0]+dp[i-1][j-2][1])%mod;            else                dp[i][j][1]=(2*dp[i-1][j-1][0]+dp[i-1][j][1]+2*dp[i-1][j-1][1])%mod;        }    }    int t;    scanf("%d",&t);    while(t--)    {        int n,k;        scanf("%d%d",&n,&k);        printf("%d\n",(dp[n][k][0]+dp[n][k][1])%mod);    }    return 0;}


                  

原创粉丝点击