HDU 4504



题目标题:

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


题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4504


题目类型:

动态规划


数据结构:


思路分析:

既然B队每次的进攻时间跟得分是固定的 

那么不如直接吧B的得分先全部加上, 

然后简化问题成 A队能不能靠剩下的进攻次数赢B


DP的方法是使用记忆搜索.

建立一个DP[i][j] 来保存  i 代表当前第几次进攻, j 代表目前A的得分

直接DFS一次即可得到答案.


模拟法则可以模拟每次A队进攻的得分范围..

比如A队一开始的分数是88分

那么第一次进攻后

它的得分可能是 89 90 91

第二次可能是 90 91 91 92 92 92 93 93 94..

以此类推,..

最后得到超过B队的分数的个数即可


证明:


源代码:

/// DP /

#include <iostream>
#include <stdio.h>

using namespace std;

typedef __int64 int64;

int Ai, Bi;
int A, B, t;
int64 dp[205][205];

int64 _dfs( int p_i, int p_j )
{
	if( dp[p_i][p_j] != -1 )
	{
		return dp[p_i][p_j];
	}

	if( p_i == Ai )
	{
		dp[p_i][p_j] = p_j > B ? 1 : 0;
		return dp[p_i][p_j];
	}


	dp[p_i][p_j] = _dfs( p_i + 1, p_j + 1 ) + _dfs( p_i + 1, p_j + 2 ) + _dfs( p_i + 1, p_j + 3 );

	return dp[p_i][p_j];
}

int main()
{
	while( scanf( "%d%d%d", &A, &B, &t ) != EOF )
	{
		memset( dp, -1, sizeof( dp ) );

		t /= 15;
		Bi = t % 2 == 0 ? t / 2 : ( t - 1 ) / 2;
		Ai = t % 2 == 0 ? t / 2 : ( t - 1 ) / 2 + 1;

		B += Bi;

		printf( "%I64d\n", _dfs( 0, A ) );
	}

	return 0;
}

/ 模拟

#include <iostream>
#include <stdio.h>
#include <map>

using namespace std;

typedef __int64 int64;

int Ai, Bi;
int A, B, t;

struct LMIC_BALL
{
	int64 val, update;
};

int main()
{
	while( scanf( "%d%d%d", &A, &B, &t ) != EOF )
	{
		int i, j;
		map<int, LMIC_BALL> rlt;

		t /= 15;
		Bi = t % 2 == 0 ? t / 2 : ( t - 1 ) / 2;
		Ai = t % 2 == 0 ? t / 2 : ( t - 1 ) / 2 + 1;
		B += Bi;
		
		( rlt[A] ).val = 1;
		
		for( i = A; i < A + Ai; i ++ )
		{
			for( j = i; j <= A + ( i - A ) * 3; j ++ )
			{
				rlt[j + 1].update += rlt[j].val;
				rlt[j + 2].update += rlt[j].val;
				rlt[j + 3].update += rlt[j].val;
			}
			
			for( j = i + 1; j <= A + ( i - A ) * 3 + 3; j ++ )
			{
				rlt[j].val = rlt[j].update;
				
				rlt[j].update = 0;
		}
		
		int64 snt = 0;
		
		for( i = A + Ai; i <= A + Ai * 3; i ++ )
		{
			if( i > B )
			{
				snt += rlt[i].val;
			}
		}
		
		printf( "%I64d\n", snt );
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值