您的位置:首页 > 其它

HDU 4504 威威猫系列故事——篮球梦

2013-03-28 21:14 127 查看
     题目大意:对于当前局势:比分A : B,还剩T时间,我方有三种得分方式:得1分,得2分,得3分;对手每次只能得1分,每次进攻耗时15秒,不足15秒不得进攻。

     鉴于前面的几题DP,所以一看到有想到DP了(为什么?为什么?因为我方得分方式描述很容易想到状态转移方程),那么根据计算,我方最多进攻20次,就算每次得3分,那也只是20*60的状态量,good~很容易就ko。

   

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define maxn
using namespace std;

long long dp[26][70]; //dp[i][j]代表我方第i轮得到j分的种类数

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++)
{
if(j>1)dp[i][j]+=dp[i-1][j-1];
if(j>2)dp[i][j]+=dp[i-1][j-2];
if(j>3)dp[i][j]+=dp[i-1][j-3];
}
}
}

int main()
{
int A,B,t;
init();  //dp计算所有的可能性

while(~scanf("%d%d%d",&A,&B,&t))
{
int k = t / 15;
int ta = (k + 1)/2;
int tb = k - ta;  //这里坑了我好惨啊

if(ta==0)
{
if(A>B) puts("1"); //这里太坑了
else puts("0");
continue;
}

B += tb;
int diff = B - A + 1;  //分差
if(diff < 0)  diff = 0;
long long ans = 0;
for(int i=diff;i<=ta*3;i++)
{
ans += dp[ta][i];
}

printf("%I64d\n",ans);
}

system("pause");
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: