P2198 杀蚂蚁 题解
题目大意
有一条长度为
-
激光塔:蚂蚁在塔前时每秒会受到
点伤害。 -
放射塔:蚂蚁经过塔后,每秒钟受到
点伤害。 -
干扰塔:蚂蚁经过塔后,每行走一个单位距离的时间延长为
。
其中,放射塔和干扰塔的效果可以叠加。比如蚂蚁经过了
现在需求能给蚂蚁们造成的最大伤害。
解法
分析题目,题目需要求一个最大值,且不在意中间过程,因此我们可以考虑 dp。
设
关于如何转移,枚举干扰塔和放射塔的个数
边界的处理和转移差不多,就是此时只有两种塔,比转移少简单一些。需要注意的是全是激光塔的情况也需要处理,也就是
由于此题答案可能过大,整数变量需要定义为 __int128
,且 __int128
无法使用 cin
、cout
、scanf
、printf
等进行输入输出,所以请手写快读快写。
AC Code
#include<bits/stdc++.h> #define int __int128 using namespace std; const int N = 2e3 + 5; int n, r, g, b, t, dp[N][N], ans; int read() { int k = 1, t = 0; char c = getchar(); while(c < '0' || c > '9') { if(c == '-') k *= -1; c = getchar(); } while(c >= '0' && c <= '9') { t = t * 10 + c - '0'; c = getchar(); } return k * t; } void write(int x) { int b[50], cnt = 0; while(x != 0) { int y = x % 10; x /= 10; b[++cnt] = y; } for(int i = cnt; i >= 1; i--) putchar(b[i] + '0'); return; } signed main() { n = read(), r = read(), g = read(), b = read(), t = read(); memset(dp, 0xcf, sizeof(dp)); dp[0][0] = n * t * r; ans = dp[0][0];//处理边界 for(int i = 1; i <= n; i++) { dp[i][0] = dp[i - 1][0] - (t + (i - 1) * b) * r + (n - i) * b * r; dp[0][i] = dp[0][i - 1] - t * r + (n - i) * t * g; ans = max(ans, max(dp[0][i], dp[i][0])); } for(int i = 1; i <= n; i++)//转移 for(int j = 1; j + i <= n; j++) dp[i][j] = max(dp[i - 1][j] - (t + (i - 1) * b) * r + (n - i - j) * b * (r + g * j), dp[i][j - 1] - t * r - i * (b * r) + (n - i - j) * (t + b * i) * g); for(int i = 1; i <= n; i++)//答案为最大值 for(int j = 1; j + i <= n; j++) ans = max(ans, dp[i][j]); write(ans); return 0; }
本文作者:Luckies
本文链接:https://www.cnblogs.com/Luckies/p/17962642/P2198
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步