题面

https://www.luogu.com.cn/problem/P1717

题解

以五分钟为一个单位,设状态方程:$g[i][j]$ 表示第 $i$ 个时间单位到达 $j$ 农场钓到的鱼。

$$
g[i][j] = \max_{0 \leq k \leq i - t[j]} \{g[i - t[j] - k][j-1] + \sum_{p = 0}^{k-1} \max (0, f[j] - p \times d[j])\}
$$

注意:这里的 $t[i]$ 和原题中不一样,是偏移过一位的。

值得注意的是

$$
f[j] - p \times d[j]
$$

需要保证大于零。

以及我们还需要保证状态是可达的才行。所以代码中要 memset -1.

代码

#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 30;
const int maxt = 1e5+5;

int f[maxn], d[maxn], t[maxn], g[maxt][maxn];

int calc(int i, int j, int k) {
    int ret = g[i - t[j] - k][j - 1];
    if (ret == -1) return ret;
    for (int i = 0; i < k; i ++)
        ret += max(0, f[j] - i * d[j]);
    return ret;
}

int main() {
    int n, h; cin >> n >> h;
    h *= 12;
    for (int i = 1; i <= n; i ++) cin >> f[i];
    for (int i = 1; i <= n; i ++) cin >> d[i];
    for (int i = 2; i <= n; i ++) cin >> t[i];
    memset(g, -1, sizeof(g));
    g[0][0] = 0;
    for (int i = 1; i <= h; i ++)
        for (int j = 1; j <= n; j ++)
            for (int k = 0; k <= i - t[j]; k ++)
                g[i][j] = max(g[i][j], calc(i, j, k));
    int ans = 0;
    for (int i = 1; i <= n; i ++)
        ans = max(ans, g[h][i]);
    cout << ans << endl;
    return 0;
}
最后修改:2022 年 03 月 30 日 11 : 54 AM
真的不买杯奶茶嘛....qwq