hdu 4301 Divide Chocolate 夜

给一个2*n 的chocolate 分成一定的块数 问有多少种情况

DP 递推

link[][]表示 到第 i 排 第i排相连 分成 j 块有多少种情况

nolink[][]表示 到第 i 排 第i排不相连 分成j块有多少种情况

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<stack>
#include<algorithm>

using namespace std;

const int N=1001;
const int MOD=100000007;

int link[N][N*2];
int nolink[N][N*2];
void begin()
{
    link[1][2]=0;
    nolink[1][2]=1;
    for(int j=3;j<N*2-1;++j)//一些边界处理
    {
        link[1][j]=0;
        nolink[1][j]=0;
    }
    for(int i=1;i<N;++i)//一些边界处理
    {
        nolink[i][2*N-1]=0;
        link[i][0]=0;
        nolink[i][0]=0;
        link[i][1]=1;
        nolink[i][1]=0;
    }
    for(int i=2;i<N;++i)
    {
        for(int j=2;j<2*N-1;++j)
        {
            link[i][j]=(link[i-1][j]+link[i-1][j-1]+nolink[i-1][j-1]+nolink[i-1][j]*2)%MOD;
            nolink[i][j]=(link[i-1][j-1]*2+link[i-1][j-2]+nolink[i-1][j]+nolink[i-1][j-1]*2+nolink[i-1][j-2])%MOD;
        }
    }
}
int main()
{
   int T;
   scanf("%d",&T);
   begin();
   while(T--)
   {
       int x,y;
       scanf("%d %d",&x,&y);
       printf("%d\n",(link[x][y]+nolink[x][y])%MOD);
   }
   return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2602300.html