请直接用c++代码写出题目描述 给出时间t,之后以任意角色开始,每秒可进行以下操作中一种: 1. 切换角色 2. 使用技能 每个技能都会造成1点伤害,下面是每个角色的技能: 草神:额外造成1点伤害,同时给对方积攒1点草元素; 行秋:给对方积攒2点水元素,并且接下来草神每一次攻击会额外积攒1点水元素(当前秒触发并消耗秒数),持续7秒; 久岐忍:最多使用s次,接下来每秒结束时将所有草原核触发(当前秒触发并消耗秒数),持续5秒。 关于草原核:敌人没有积攒元素上限,同时每有1点水元素和草元素就会消耗,造成绽放,生成1个草原核,如果被触发会造成超绽放,额外造成m点伤害。 输入格式 分别给出t(1<=t<=180),s(0<=s<=30),m(3<m)。 输出格式 输出最高伤害。
时间: 2024-03-03 19:49:29 浏览: 56
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200, M = 100, S = 35;
int dp[N][3][M];
int f[M];
int t, s, m;
int main()
{
cin >> t >> s >> m;
// 预处理草原核造成的最大伤害
for (int i = 1; i < M; i ++)
{
int d = min(i, m - 1);
f[i] = i - d + d * (d + 1) / 2;
}
memset(dp, -0x3f, sizeof dp);
dp[0][0][0] = 0;
for (int i = 0; i < t; i ++)
for (int j = 0; j < 3; j ++)
for (int k = 0; k < M; k ++)
{
// 切换角色
dp[i + 1][j ^ 1][k] = max(dp[i + 1][j ^ 1][k], dp[i][j][k]);
// 使用草神技能
if (j == 0)
dp[i + 1][0][k + 1] = max(dp[i + 1][0][k + 1], dp[i][0][k] + 2);
// 使用行秋技能
if (j == 1)
{
dp[i + 1][1][k + 2] = max(dp[i + 1][1][k + 2], dp[i][1][k] + 2);
for (int l = min(i + 7, t); l > i; l --)
dp[l][0][k + l - i] = max(dp[l][0][k + l - i], dp[i][1][k] + l - i + 1);
}
// 使用久岐忍技能
if (j == 2 && s > 0)
{
s --;
for (int l = min(i + 5, t); l > i; l --)
dp[l][0][k] = max(dp[l][0][k], dp[i][2][k] + f[k]);
}
}
int res = 0;
for (int i = 0; i < M; i ++) res = max(res, dp[t][0][i] + f[i]);
cout << res << endl;
return 0;
}
```
阅读全文