hdu 4301Divide Chocolate(dp)

来源:互联网 发布:中国历代位面之子知乎 编辑:程序博客网 时间:2024/05/02 09:05

这题的题意是,给你一个2*n的巧克力,问你如果把他分成k块,有多少种分法

dp[i][j][k] 表示的就是 ,第i 层 分成k块, 最后一层是分开的还是合上的 ,有多少种分法。

AC代码:

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<map>using namespace std;const int N=1000;const int mod=100000007;typedef long long ll;int dp[N+1][2*N+1][3];void init(){    memset(dp,0,sizeof(dp));//1表示分开 2表示合在一起     dp[1][1][0]=1;dp[1][1][2]=1;    dp[1][2][0]=1;dp[1][2][1]=1;    for(int i=2;i<=1000;i++){        for(int j=1;j<=2000;j++){            dp[i][j][1]+=dp[i-1][j][1];            dp[i][j][2]+=dp[i-1][j][2]+dp[i-1][j][1]*2;            dp[i][j][1]+=dp[i-1][j-1][1]*2+dp[i-1][j-1][2]*2;            dp[i][j][2]+=dp[i-1][j-1][1]+dp[i-1][j-1][2];            dp[i][j][1]+=dp[i-1][j-2][1]+dp[i-1][j-2][2];            dp[i][j][1]%=mod;            dp[i][j][2]%=mod;            dp[i][j][0]=(dp[i][j][1]+dp[i][j][2])%mod;        }    }}int main(){    init();    int n;    scanf("%d",&n);    while(n--){        int a,b;        scanf("%d%d",&a,&b);        printf("%d\n",dp[a][b][0]);            }}


0 0
原创粉丝点击