递推。
a[n][m][k]=a[n-1][m][k]+b[n-1][m][k-1];
b[n][m][k]=a[n-1][m-1][k-1]+b[n-1][m-1][k];
ans[n][m][k]=a[n][m][k]+b[n][m][k]。
a[n][m][k]:n个座位、m个人、k段、最后一个位置没有人,的情况数;
b[n][m][k]:n个座位、m个人、k段、最后一个位置有人,的情况数。
#include<stdio.h>
#include<string.h>
#define N 201
__int64 a[N][N][21],b[N][N][21],ans[N][N][21];//开小点
int main()
{
__int64 i,j,k,n,m,q;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
a[1][0][1]=1;b[1][1][1]=1;
for(i=2;i<=200;i++)
for(j=0;j<=i;j++)//注意从0 开始
for(k=1;k<=20&&k<=i;k++)
{
a[i][j][k]=a[i-1][j][k]+b[i-1][j][k-1];
if(j)//判断一下
b[i][j][k]=a[i-1][j-1][k-1]+b[i-1][j-1][k];
ans[i][j][k]=a[i][j][k]+b[i][j][k];
}
while(scanf("%I64d%I64d%I64d",&n,&m,&q)!=EOF)
{
printf("%I64d\n",ans[n][m][q]);
}
return 0;
}
hdu 2861

最新推荐文章于 2017-09-04 10:38:15 发布