pku 3786 DP

    技术2022-05-20  49

    /*  * 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; }


    最新回复(0)