2013腾讯编程马拉松初赛第〇场(3月20日)HDOJ 4504 威威猫系列故事——篮球梦

转自:http://blog.csdn.net/aclion/article/details/8703623

#include <cstdio>  
#include <cstring>  
int A, B, t;  
int tA, tB, round, dp[30][100];   
void init() {  
    memset( dp, 0, sizeof(dp) );  
    dp[1][1] = dp[1][2] = dp[1][3] = 1;  //这个初始化,很简单  
    for ( int i = 2; i <= 20; ++i )   
        for ( int j = 1;j <= 60; ++j ) {  //对于每场比赛,可能得1,2,或3分,j是第i场比赛之前包括第i场得到的分数  
            if ( j > 1 ) dp[i][j] += dp[i-1][j-1];  //如果在本场比赛中得一分,那么它之前的状态就是前一场比赛得j-1分的状态,那么有dp[i-1][j-1]有多少种,那么dp[i][j]里面就应该包括多少种  
            if ( j > 2 ) dp[i][j] += dp[i-1][j-2]; //和上一个类似,就是如果得分是2分,那么之前的状态就是前一场得j-2分的状态,那么这些种数也包括在dp[i][j] 里面  
            if ( j > 3 ) dp[i][j] += dp[i-1][j-3]; //同上  
        }  
}  
int main()  
{  
    init();  
    while ( scanf("%d%d%d", &A, &B, &t) == 3 ) {  
        round = t / 15;  
        tA = (round+1) / 2;  
        tB = round - tA;  
        if ( round == 0 ) {  //这个状态不能忘了  
            if ( A > B ) printf("1\n");  
            else printf("0\n");  
            continue;  
        }  
        B += tB;  
        int tmp = B - A + 1;  
        if ( tmp < 0 ) tmp = 0;  //这个情况一定要考虑到,如果B远小于A的话,就是负数,如果没有这一步,后面一定错  
        long long ans = 0;  
        for ( int i = tmp; i <= 60; i++ ) ans += dp[tA][i];  //这个就是在进行tA场比赛后,得分满足要求的状态的和,即>=tmp得分  
        printf("%I64d\n", ans);  
    }  
}  


你可能感兴趣的:(腾讯,动态规划,编程马拉松)