/*
* File: main.cpp
* Author: acm
* dp[i][0][k]表示第i位为0时各位相乘结果为k的个数,
* dp[i][1][k]表示第i位为1时各位相乘结果为k的个数,则最后的结果数为两者之和
* Created on 2011年2月26日, 下午4:05
*/
#include <cstdlib>
#include <stdio.h>
using namespace std;
int const maxn=101;
int dp[maxn][2][maxn];
int main(int argc, char** argv) {
int cas,m,n,k,i,j;
int p,q,r;
scanf("%d",&cas);
for(j=1;j<=cas;j++)
{
scanf("%d %d %d",&m,&n,&k);
dp[1][0][0]=1;
dp[1][1][1]=1;
dp[1][1][0]=0;
dp[1][0][1]=0;
dp[2][0][0]=2;dp[2][0][1]=0;dp[2][1][0]=1;dp[2][1][1]=1;
//以上为初始化
for(i=3;i<=n;i++)
{
dp[i][0][0]=dp[i-1][0][0]+dp[i-1][1][0];
dp[i][1][0]=dp[i-1][0][0];
//各位相乘为0的需要特殊处理
for(p=1;p<=k;p++)
{
dp[i][0][p]=dp[i-1][0][p]+dp[i-1][1][p];
dp[i][1][p]=dp[i-1][1][p-1]+dp[i-1][0][p];
}
// printf("*%d %d",dp[i][0][1],dp[i][1][1]);
}
printf("%d %d/n",j,dp[n][0][k]+dp[n][1][k]);
}
return 0;
}
pku 3786 DP
最新推荐文章于 2016-03-25 10:35:49 发布