hdu 4504(动态规划)

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

Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3940    Accepted Submission(s): 1028

Problem Description

  威威猫十分迷恋篮球比赛,是忠实的NBA球迷,他常常幻想自己那肥硕的身躯也能飞起扣篮。另外,他对篮球教练工作也情有独钟,特别是对比赛的战术,投篮选择方面也是很有研究,下面就是威威猫研究过的一个问题:
 
 一场NBA篮球比赛总共48分钟,假如我们现在已经知道当前比分
A:B,A代表我方的比分,B代表对方的比分,现在比赛还剩下t秒时间。我们简单的认为双方各自进攻一次的时间皆固定为15秒(不到15秒则进攻不得
分),且为交替进攻,即我方进攻一次,接着对方进攻,依次循环。
  进攻有三种选择方式:(这里不考虑命中率)
  1、造犯规,(假设都两罚一中)得1分;
  2、中距离投篮 得2分;
  3、三分球 得3分。
 
 为了简化问题,假设在对方回合,由于我方防守比较好,只让对手得1分,且为固定,即对方的进攻回合就为每回合得1分。现在比赛进入最后关头,接下来第一
个回合是我方进攻,现在威威猫想要知道教练有多少种不同的选择能使我方可能赢得比赛(可能的意思就是不考虑命中率的情况)。

Input

输入有多组数据(不超过250组);
每组数据包含3个整数A,B和t,其中A和B 表示当前的比分(0 <= A, B <= 200),t表示还剩多少时间(单位秒 0 <= t <= 600)。

Output

请输出可行的方案数,每组数据输出占一行。

Sample Input

88 90 50

Sample Output

6

dp[i][j]代表进攻i次得到j分的方案数.

dp[i][j] = dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3].

然后再去算在进攻次数下得到 m-n+1 -> 3*进攻次数 这么多分情况下所有的得分可能。

#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 25;
int dp[N][3*N]; ///dp[i][j]代表进攻 i 次得到 j 分的方案数,最多也就 600/15/2次机会,分数最多为600/15/2*3分
int main(){
    dp[0][0] = dp[1][1] = dp[1][2] = dp[1][3] =1;
    for(int i=2;i<N;i++){
        for(int j=1;j<3*N;j++){
            dp[i][j] += dp[i-1][j-1]; ///本次进攻得到1分
            if(j>=2) dp[i][j]+=dp[i-1][j-2]; ///本次进攻得到2分
            if(j>=3) dp[i][j]+=dp[i-1][j-3]; ///本次进攻得到3分
        }
    }
    int n,m,t;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF){
        LL ans = 0;
        int t1,t2;
        t2 = t/30;
        t1 = t/15 - t2;
        m+=t2; ///对方的最终分数
        int k = (m-n+1)>0?m-n+1:0;
        for(int i=k;i<=t1*3;i++){
            ans+=dp[t1][i];
        }
        printf("%lld\n",ans);
    }
}
时间: 2024-10-22 09:44:47

hdu 4504(动态规划)的相关文章

FatMouse&#39;s Speed hdu 1160(动态规划,最长上升子序列+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:现给出老鼠的体重与速度,要求你找出符合要求的最长子序列.       要求是 W[m[1]] < W[m[2]] < ... < W[m[n]](体重) && S[m[1]] > S[m[2]] > ... > S[m[n]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合

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

http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 中文都看得懂.不过我是看hint才正确理解什么意思的.开始的时候理解错了. 解题思路: 给定时间最多是600,最多进攻次数600/15=40次,我方进攻次数40/2=20次.如果深度搜索多少种情况, 那么时间复杂度是O(3^20),直接就超时了. 我知道要动态规划,但是自己dp不行,所以就看了网上别人的解题报告. dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i

C - Monkey and Banana HDU 1069( 动态规划+叠放长方体)

C - Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1069 Description A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof

hdu 2571 动态规划

简单的动态规划 #include<cstdio> #include<cstring> #define Max(a,b) (a>b?a:b) int dp[21][1001]; int map[21][1001]; int main() { int t; scanf("%d",&t); while(t--) { int m,n; scanf("%d%d",&n,&m); for(int i=1;i<=n;i+

HDU 1003 动态规划

http://acm.hdu.edu.cn/showproblem.php?pid=1003 这几天开始刷动归题目,先来一道签到题 然而做的并不轻松, 没有注意到边界问题, WA了几发才发现 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int donser[100000]; int d[100000]; int main() { int i,j,k,test,n,m

hdoj-1171-Big Event in HDU【动态规划】

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28852 Accepted Submission(s): 10143 Problem Description Nowadays, we all know that Computer College is the biggest department in H

HDU 1074 动态规划

HDU 1074 慢慢写了半个多小时的dp,思路很清楚,二进制保存状态,然后如果这个状态为0,就添上1转移,并且记录路径,做之前一定要想好要记录哪些东西,由于一个状态不管cost是啥,总之是一样的.因为不管什么状态,加到这一步,总天数都是一样的. #include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <ma

HDU 1171 Big Event in HDU (动态规划、01背包)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 57986    Accepted Submission(s): 19484   Problem Description Nowadays, we all know that Computer College is the biggest departme

hdu 5185 动态规划 分析降低复杂度

这题说的是 x[1]+x[2]+x[3]+…+x[n]=n, 这里 0 <= x[i] <= n && 1 <= i <= n x[i] <= x[i+1] <= x[i]+1 && 1 <= i <= n-1 对于一个给定的n,Gorwin想要知道有多少xi的组合满足上述等式.由于结果比较大,输出答案对m取余的结果就行. n<=50000 经过分析我们知道第一个数必须是 0  或者 1 ,如果是0 那么我们分析,第一个