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

来源:互联网 发布:java数据源是什么 编辑:程序博客网 时间:2024/05/18 02:07

转自: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);      }  }