Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37718 Sakuzyh 【BJ】T1 C++ 通过 100 53 MS 31700 KB 1163 2025-05-02 16:54:34

Tests(65/65):


// Author: Aquizahv #include <bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define lnf 0x3f3f3f3f using namespace std; const int N = 2005, M = 2005, NM = 4005; int n, m, l[N], s[N], c[NM]; vector<int> p[N]; int dp[NM][N], pre[M][N]; inline void getmax(int &to, int fro) { to = max(to, fro); } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) scanf("%d", l + i); for (int i = 1; i <= n; i++) scanf("%d", s + i); reverse(l + 1, l + n + 1); reverse(s + 1, s + n + 1); for (int i = 1; i <= n + m; i++) scanf("%d", c + i); memset(dp, -0x40, sizeof(dp)); for (int i = 0; i <= n + m; i++) dp[i][0] = 0; for (int i = 1; i <= n; i++) { for (int k = n - 1; k >= 0; k--) getmax(dp[l[i]][k + 1], dp[l[i]][k] - s[i] + c[l[i]]); int lmt = n; for (int j = l[i]; j < n + m; j++, lmt >>= 1) { for (int k = 0; k <= lmt && dp[j][k] > -inf; k++) getmax(dp[j + 1][k / 2], dp[j][k] + c[j + 1] * (k / 2)); } } cout << dp[m + n][0] << endl; return 0; }


测评信息: