提交时间:2025-05-02 16:54:22
运行 ID: 37717
// 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() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); 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; }