题目:http://acm.hdu.edu.cn/showproblem.php?pid=4504
腾讯第二届马拉松3月20日第0场第5题。
DP。dp[i][j]代表i次进攻得到j分的种类数
另外本题用%I64提交能A,用%lld提交就不能A。。这。。。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <string>
using namespace std;
//dp[i][j]代表i次进攻得到j分的种类数
int 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++)
{
//第i场只得1分
if(j>1) dp[i][j] += dp[i-1][j-1];
//第i场只得2分
if(j>2) dp[i][j] += dp[i-1][j-2];
//第i场只得3分
if(j>3) dp[i][j] += dp[i-1][j-3];
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
init();
int a,b,t;
while(scanf(" %d %d %d",&a,&b,&t)!=EOF)
{
int cas = t/15;
int casA = (cas + 1)>>1;
int casB = cas - casA;
if(casA == 0)
{
if(a>b)
{
printf("1\n");
}
else
{
printf("0\n");
}
continue;
}
//a需要拿到的最小得分
int minGrade = b-a+1;
minGrade += casB;
if(minGrade<0) minGrade = 0;
long long ans = 0;
for(int i=minGrade;i<=60;i++)
{
ans += dp[casA][i];
}
printf("%I64d\n",ans);
}
return 0;
}