hdu 4301 Divide Chocolate

来源:互联网 发布:sx2150k基本数据 编辑:程序博客网 时间:2024/04/30 12:51

Divide Chocolate

DP状态:dp[i][j][1]表示前i个分成j部分并且最后一行被分在不同的部分中的个数,dp[i][j][0]表示前i个分成j部分并且最后一行被分在相同的部分中的个数
可以先预处理出1000内所有的,然后只需要查询即可。


/*    author    : csuchenan    prog      : hdu4301    algorithm : DP dp[i][j][0],表示前i个分成j分并且最好一行在同一块中的个数,                dp[i][j][1].表示前i个分成j分并且最后一行分在不同的块具体看程序    2012-10-19 23:02:18Accepted430131MS16024K801 BC++csu_chenan*/#include <cstdio>#include <cstring>const int mod = 100000007;const int maxn = 1005;int dp[maxn][maxn*2][2];int n, k;int main(){    int T;    memset(dp, 0, sizeof(dp));    dp[1][1][0] = 1;    dp[1][2][1] = 1;    for(int i = 2; i <= 1000; i ++){        dp[i][1][0] = 1;        for(int j = 2; j <= i * 2; j ++){            dp[i][j][0] = (dp[i][j][0] + dp[i-1][j-1][0] + dp[i-1][j-1][1] +                dp[i-1][j][0] + 2*dp[i-1][j][1])%mod;            dp[i][j][1] = (dp[i-1][j-2][0] + dp[i-1][j][1] + dp[i][j][1]+                dp[i-1][j-1][0]*2 + dp[i-1][j-1][1]*2 + dp[i-1][j-2][1])%mod;        }    }    scanf("%d", &T);    while(T--){        scanf("%d%d", &n , &k);        printf("%d\n", (dp[n][k][1] + dp[n][k][0])%mod);    }    return 0 ;}


原创粉丝点击