记录编号 611170 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [THUPC 2025 pre] 骑行计划 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 10.932 s
提交时间 2026-01-24 16:21:36 内存使用 46.56 MiB
显示代码纯文本
// copyright @ Zhean Xu
#include <bits/stdc++.h>
using namespace std;

const int N = 155;
int f[N][N][N], g[N][N][N], h[N][N][N], cost[N][N], sum[N][N], s[N];
int n, m, c, mx;

void cmin(int &x, int y) {
    if (y < x) x = y;
}

int main() {
    freopen("thupc_2025_pre_A.in", "r", stdin);
    freopen("thupc_2025_pre_A.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &c);
    for (int i = 1; i <= n; i ++) {
        scanf("%d" , s + i);
        mx = max(mx, s[i]);
    }
    for (int i = 1; i <= mx; i ++) {
        for (int j = 1; j <= n; j ++) {
            sum[i][j] = sum[i][j - 1] + max(0, s[j] - i + 1);
        }
    }

    memset(cost, 0x3f, sizeof cost);
    for (int i = 1; i <= m; i ++) {
        int w, d, t;
        scanf("%d%d%d", &w, &d, &t);
        cmin(cost[min(t, mx)][d], w);
    }
    for (int i = 1; i <= mx; i ++) {
        for (int j = n; j >= 1; j --) {
            cmin(cost[i][j], cost[i][j + 1]);
        }
    }

    memset(f, 0x3f, sizeof f);
    memset(g, 0x3f, sizeof g);
    memset(h, 0x3f, sizeof h);
    for (int i = mx; i >= 1; i --) {
        for (int l = n; l >= 1; l --) {
            for (int r = l; r <= n; r ++) {
                f[i][l][r] = g[i][l][r] = (sum[i][r] - sum[i][l - 1]) * c;
                for (int x = l; x <= r; x ++) {
                    int tmp = (l <= x - 1 ? f[i][l][x - 1] : 0);
                    tmp += min(cost[mx][r - x + 1], h[i + 1][x][r]);
                    cmin(g[i][l][r], tmp);
                }
                for (int y = l; y <= r; y ++) {
                    int tmp = (y + 1 <= r ? f[i][y + 1][r] : 0);
                    tmp += g[i][l][y];
                    cmin(f[i][l][r], tmp);
                }
                h[i][l][r] = min(h[i + 1][l][r],
                    + cost[i - 1][r - l + 1] + f[i][l][r]);                       
            }
        }
    }   
    cout << f[1][1][n] << endl;

    return 0;
}