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

来源:互联网 发布:js 语音波形图 编辑:程序博客网 时间:2024/04/29 21:55

     题目大意:对于当前局势:比分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;}


 

原创粉丝点击