hdu4939Stupid Tower Defense(DP)

题目:hdu4939Stupid Tower Defense(DP)

题目大意:保卫游戏。给出一条长度n的道路,这条道路上每个单元长度可以放一个塔。现在有三种塔:红塔:怪经过这个塔的时候受到X的伤害每秒。绿塔:怪经过这个塔之后,以后的每秒都受到Y的伤害。蓝塔:怪经过这个塔后,之后每经过单元长度的时间加长为t + Z;问怎样选择这三种塔能够使得伤害值最大。

解题思路:一开始没有想到这是DP, 看了题解才发现放塔的时候红塔应该放在最后面最优,那么就只要放蓝绿塔就行,而且前面哪个位置放了蓝绿塔对后面是没有影响,只有蓝绿塔的数目和后面的伤害值有关。这样的话,dp【i】【j】代表前面i个位置,放了j个绿塔,i - j个蓝塔的最大伤害值(后面的都是n - i都是红塔但是伤害值没有计算在内)。然后分别考虑i + 1个位置是放蓝塔还是放绿塔。最后就是维护最大值,这个过程中,任何的一种方法都可能造成最大伤害。然后要注意后面的n - i的红塔的伤害值最后要加上,并且后面的单元长度的蓝塔的伤害也不能漏掉。

代码:

#include <cstdio>
#include <cstring>

typedef __int64 ll;
//typedef long long ll;

const int N = 1505;
ll n, x, y, z, t;
ll dp[N][N];

ll Max (const ll a, const ll b ) { return a > b ? a: b; }

ll solve () {

	memset (dp, 0, sizeof (dp));
	ll ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j <= i; j++) {

			ll T = t + j * z;//经过一个单元的时间
			ll W = T * (i - j) * y;//一个单元长度(i - j)个绿塔的伤害
			dp[i + 1][j + 1] = Max (dp[i + 1][j + 1],dp[i][j] + W);//第i+1个单元放蓝塔
			dp[i + 1][j] = Max (dp[i + 1][j], dp[i][j] + W);       //第i+1个单元放绿塔
			ans = Max (ans, dp[i][j] + (n - i) * (x * T + W));     //i单元后面全部放红塔
		}
	}

	for (int i = 0; i <= n; i++)
		ans = Max (ans, dp[n][i]);
	return ans;
}

int main () {

	int cas;
	scanf ("%d", &cas);
	for (int i = 1; i <= cas; i++) {
	//	scanf ("%lld%lld%lld%lld%lld", &n, &x, &y, &z, &t);
		scanf ("%I64d%I64d%I64d%I64d%I64d", &n, &x, &y, &z, &t);
		printf ("Case #%d: %I64d\n", i, solve());
	//	printf ("Case #%d: %lld\n", i, solve());
	}
	return 0;
}

hdu4939Stupid Tower Defense(DP)

时间: 2024-11-08 22:35:22

hdu4939Stupid Tower Defense(DP)的相关文章

2014多校第七场1005 || HDU 4939 Stupid Tower Defense (DP)

题目链接 题意 :长度n单位,从头走到尾,经过每个单位长度需要花费t秒,有三种塔: 红塔 :经过该塔所在单位时,每秒会受到x点伤害. 绿塔 : 经过该塔所在单位之后的每个单位长度时每秒都会经受y点伤害. 蓝塔 : 经过该塔所在单位之后,再走每个单位长度的时候时间会变成t+z. 思路 : 官方题解 : 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define LL long long

hdu4939 Stupid Tower Defense (DP)

2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 366    Accepted Submission(s): 88 Problem Description FSF is addicted to a stupid tower defense game.

hdu 4939 Stupid Tower Defense(DP)2014多校训练第7场

Stupid Tower Defense                                                                         Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description FSF is addicted to a stupid tower defense game. Th

hdu 4939 Stupid Tower Defense (dp)

题目大意: 简单的塔防游戏,有三种塔. 一种是减速塔,只能减速它身后的敌人,使之移动速度减慢.通过一格的时间变成加z秒. 两种攻击塔,一种只能打面前,另外一种可以打身后. 思路分析: 我们默认把只能攻击面前的塔放到最后面. 状态方程: dp [i] [j]  表示放到第 i 个位置放了 j 个防御塔能达到的最大伤害. 转移方程:dp [i] [j] =max ( dp[i-1][j] + buildy ,  dp[i-1][j-1] + buildz ) buildy 表示第 i 位置建一个 攻

HDOJ题目4939 Stupid Tower Defense(dp)

Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1759    Accepted Submission(s): 498 Problem Description FSF is addicted to a stupid tower defense game. The goal of tower

HDU 4939 Stupid Tower Defense(dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 解题报告:一条长度为n的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一种塔只给在这个塔的范围内的敌人每秒造成x点的伤害,第二种塔给已经经过过这个塔的敌人每秒造成y点伤害,第三种塔能使已经经过了这个塔的敌人的前进的速度减慢,具体效果是,原来敌人经过一个单元格的时间是t秒,经过减速后,经过每个单元格的时间是t + z,这个一个塔减速的效果,减速的效果可以叠加,同样,第二种

HDU 4939 Stupid Tower Defense(贪心+dp)

HDU Stupid Tower Defense 题目链接 题意:有一些塔,红塔能攻击经过他的,绿塔能攻击经过之后的,蓝塔能把经过之后的减速,求在1-n上放塔,求伤害最大值 思路:一开始以为直接贪心,绿塔最前,蓝塔中间,红塔最后就可以了,结果其实是错的 不过,红塔放最后是肯定的,这个很显然就不多证明了,是贪心的思想 然后就dp[i][j]表示放到i,前面有j个绿塔去状态转移即可 代码: #include <cstdio> #include <cstring> #include &l

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <