题目

Stupid Tower Defense

在坐标轴[1,n][1,n][1,n]上,每两个相邻的整数点之间可以放置一座防御塔。

怪物初始时 ttt 秒移动一个单位。

  • 防御塔111:在当前线段上的敌人每秒受到xxx伤害。例如在[1,2)[1,2)[1,2)上放置一座防御塔111,怪物在[1,2)[1,2)[1,2)上行走每秒会受到xxx伤害。

  • 防御塔222:在当前线段后的敌人每秒受到yyy伤害。例如在[1,2)[1,2)[1,2)上放置一座防御塔222,怪物在[2,n)[2,n)[2,n)上行走每秒会受到yyy伤害。

  • 防御塔333:在当前线段后的敌人被减速zzz。例如在[1,2)[1,2)[1,2)上放置一座防御塔333,怪物在[2,n)[2,n)[2,n)上行走会被减速zzz,也就是t=t+zt=t+zt=t+z。

防御塔2/3的效果可以叠加。

数据范围 (2<=n<=1500 , 0<=x,y,z<=60000 1<=t<=3)

问一个敌人从111走到nnn受到的最大伤害是多少。

解题思路

经过一点分析,显然有防御塔1肯定是连续的放置在最后面一段区间。

令DP[i][j]DP[i][j]DP[i][j]为前iii个防御塔,放置jjj个防御塔222、i−ji-ji−j个防御塔333的最大伤害,iii后面全为防御塔333。这时候,前面防御塔2/3的排列顺序对后面的贡献无影响。只记录数量即可。

因此有状态转移方程:

dp[i][j] = dp[i-1][j] + V1;
dp[i][j] = dp[i-1][j-1] + V2;
ans = max(ans , dp[i][j] + 后面全为防御塔1的价值)

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <unordered_map>
#include <map>
#include <vector>
using namespace std;const int N = 1505;
long long dp[N][N]; //前i个有j个减速 i-j个后攻
int CA;
void solve()
{memset(dp, 0, sizeof dp);long long n, x, y, z, t;scanf("%lld %lld %lld %lld %lld", &n, &x, &y, &z, &t);long long ans = t * x * n;long long a = 1, b = 0, len = n - 1; //a减速 b后攻 c行程ans = max(ans, (a * z + t) * (b * y + x) * len);a = 0, b = 1, len = n - 1;ans = max(ans, (a * z + t) * (b * y + x) * len);dp[1][0] = 0;dp[1][1] = 0;for (int i = 2; i <= n; i++){for (int j = 0; j <= i; j++){if (!j){dp[i][j] = max(dp[i][j], dp[i - 1][j] + (i - 1) * y * t);long long a = 0, b = i, len = n - i; //a减速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);}else{//当前放减速long long T = t + (j - 1) * z;long long D = ((i - 1) - (j - 1)) * y;dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + T * D); //当前放减速long long a = j, b = i - j, len = n - i;            //a减速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);//当前放后攻,dp[i][j]从dp[i-1][j]转移 因此只有i!=j 当前才能放后攻if (i != j){T = t + j * z;D = ((i - 1) - j) * y;dp[i][j] = max(dp[i][j], dp[i - 1][j] + T * D); //当前放后攻a = j, b = i - j, len = n - i;                  //a减速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);}}}}printf("Case #%d: %lld\n", ++CA, ans);
}
int main()
{int t;cin >> t;while (t--)solve();return 0;
}

hdu4939思维DP相关推荐

  1. CodeForces - 1353E K-periodic Garland(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...

  2. 思维dp ---- Codeforces Round #142 (Div. 1) D. Towers

    题目链接 题目大意: 你可以把第iii座塔和i+1i+1i+1座或i−1i-1i−1座合并成一个 使得到的那座塔的高度是原来两座塔的和 问最使序列变成严格不增最小合并次数 解题思路: 首先我想到的是贪 ...

  3. 思维dp ---- CF41D Pawn [可达状态统计dp]

    题目链接 题目大意: 解题思路: 如果没有 k+1∣∑wk+1|\sum wk+1∣∑w 的限制的话就是个简单的 dp dp[i][j]=max(dp[i+1][j−1],dp[i+1][j+1])d ...

  4. 思维dp ---- 复杂状态找中间状态作为dp状态 1552F - Telepanting

    题目链接 题目大意: 有个蚂蚁从000号点要到xn+1x_n+1xn​+1的位置. 在x0,x1,x2,x3,.....,xn+1,xnx_0,x_1,x_2,x_3,.....,x_{n+1},x_ ...

  5. 思维dp ---- K步最短路 D. Explorer Space

    题目链接 解题思路: 这题目本质就是求K/2步最短路然后乘以2就可以了因为要回去嘛 如何求k/2步最短路呢? 就是我们dp[k][i][j]dp[k][i][j]dp[k][i][j]求的是kkk步到 ...

  6. 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]

    题目大意: 将2n2n2n个点两两相连形成n对,对于任意两个点对A和B,要求至少满足其中一条: 1.A和B的某一个完全包含于另一个中 2.A和B的长度相等.问你一共有多少种方案. 解题思路: 题解:假 ...

  7. D.Digits 思维dp 取log乘积变成加法

    题目链接 题目大意: 就是给你nnn个数和一个数字ddd,问你从这n个数中挑出若干个数,使得这些数的乘积最后的一个数字是d,并且结果是最大的,问你要挑出哪些数字? n∈[1,1e5],ai∈[1,10 ...

  8. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  9. D. Colored Rectangles[思维dp]

    题意: 3种颜色木棍,每次从两种颜色木棍各选一对组成矩形.求最后所有矩形面积和最大值. #include <cstdio> #include <cstring> #includ ...

  10. CodeForces - 1498D Bananas in a Microwave(思维+dp)

    题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...

最新文章

  1. 松翰松翰c语言编程指导,松翰C程序检单例程代码下载
  2. 嗯?那你来说说用 ArrayList 还是 LinkedList
  3. pandas object转float_25个Pandas实用技巧
  4. C/C++调用java---JNI常用函数
  5. 带叉叉的GridView
  6. BASH系列(2)——变量
  7. ABC + DEF = GHI //递归思想的充分体现(重难点)
  8. 双主动桥隔离双向DC-DC变换器(五)硬件设计和优化
  9. 世界最强大的UltraLAB便携图形工作站介绍
  10. Python初级入门精讲-王大鹏-专题视频课程
  11. mongoDB——metadata之我见
  12. 课下作业(选做)第八周
  13. AVL树的理解及自写AVL树
  14. 深度学习环境搭建之七_Ubuntu安装微信、QQ、百度网盘
  15. 新华社中移动共建搜索引擎
  16. 破解山西网通、电信的禁止路由共享(网络尖兵类软件)转载
  17. Spring EL表达式使用详解
  18. 销售单显示进仓单价的若干问题
  19. 深度学习之图像识别核心技术与案例实战
  20. 通过例子学TLA+(九)--元组和结构体

热门文章

  1. 基于VC的Ceasar加密和解密技术
  2. css3动画按钮_CSS3的动画按钮
  3. 矩阵的特征值和特征向量
  4. Modbus通信协议格式以及功能码
  5. leetcode 5855. 找出数组中的第 K 大整数(C++、java、python)
  6. CTF逆向-[安洵杯 2019]game-使用deflat对主要混淆脱混淆后常规逻辑判断
  7. CHD安装Hadoop
  8. 1999年冬发出第一个论坛帖,弹指二十年后,他们遇见了AI
  9. Flash视频教程一把抓,自动获取Flash教程----谭石南
  10. HDU 2042 不容易系列之二