http://acm.hdu.edu.cn/showproblem.php?pid=4504
知道是DP就很好做了。。。dp[i][j]表示 前i个得分,得分为j的可能性为多少
#include <iostream>
using namespace std ;
const int maxn = 66;
long long dp[maxn][maxn] ;// 前i个得分,得分为j的可能性为多少
void gettable()
{
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++)
{
if(j-1>=0)
dp[i][j] += dp[i-1][j-1];
if(j-2>=0)
dp[i][j] += dp[i-1][j-2];
if(j-3>=0)
dp[i][j] += dp[i-1][j-3];
}
}
}
void main()
{
int a,b,t;
gettable();
while(cin>>a>>b>>t)
{
int time = t/15;
int btime = time/2;
int atime = time - btime ;
int bnum = b+btime ;
int aneednum = bnum+1 - a ;
if(aneednum<0)
aneednum =0;
//special case1 :
if(time == 0)
{
if(a>b)
cout <<1<<endl;
else
cout <<0<<endl;
continue ;
}
//special case2 :long long
long long ans = 0;
for(int i=aneednum ;i<=60;i++)
{
ans += dp[atime][i];
}
printf("%I64d\n",ans) ;
}
}