超时半天终于调出来了
2025-07-27 15:31:24
发布于:浙江
6阅读
0回复
0点赞
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 56, maxk = 105, maxm = 2e3 + 5, INF = 1e9 + 7;
char read_ch() {
char ch = getchar();
while (ch != 'A' && ch != 'B') ch = getchar();
return ch;
}
struct Edge {
int v, nex; LL w;
Edge(int v = 0, LL w = 0, int nex = 0) : v(v), w(w), nex(nex) {}
} E[maxn << 1];
int hd[maxn], tote;
void addedge(int u, int v, LL w) {
E[++tote] = Edge(v, w, hd[u]), hd[u] = tote;
}
int N, M, hsf[maxn];
LL cst[maxn], lim[maxn], v[maxn], f[maxn][maxk][maxm], g[maxm], ans;
void dfs(int u) {
if (!u) {
for (int i = hd[u]; i; i = E[i].nex) {
dfs(E[i].v);
for (int j = M; j >= 0; j--)
for (int k = 0; k <= j; k++)
f[u][0][j] = max(f[u][0][j], f[u][0][j - k] + f[E[i].v][0][k]);
}
return ;
}
if (!hd[u]) {
lim[u] = min(lim[u], M / cst[u]);
for (int i = lim[u]; i >= 0; i--)
for (int j = i; j <= lim[u]; j++)
f[u][i][j * cst[u]] = (j - i) * v[u];
return ;
}
lim[u] = INF;
for (int i = hd[u]; i; i = E[i].nex) {
int v = E[i].v;
dfs(v);
lim[u] = min(lim[u], lim[v] / E[i].w), cst[u] += cst[v] * E[i].w;
}
lim[u] = min(lim[u], M / cst[u]);
for (int j = 0; j <= lim[u]; j++) {
for (int i = 0; i <= M; i++) g[i] = -INF;
g[0] = 0;
for (int i = hd[u]; i; i = E[i].nex) {
int v = E[i].v;
for (int x = M; x >= 0; x--) {
LL newgx = -INF;
for (int y = 0; y <= x; y++)
newgx = max(newgx, g[x - y] + f[v][j * E[i].w][y]);
g[x] = newgx;
}
}
for (int i = 0; i <= j; i++)
for (int k = 0; k <= M; k++)
f[u][i][k] = max(f[u][i][k], g[k] + (j - i) * v[u]);
}
}
int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++) for (int j = 0; j <= 100; j++) for (int k = 0; k <= M; k++)
f[i][j][k] = -INF;
for (int i = 1; i <= N; i++) {
scanf("%lld", &v[i]); char t = read_ch();
if (t == 'A') {
int C; scanf("%d", &C);
while (C--) {
int v; LL w;
scanf("%d%lld", &v, &w);
addedge(i, v, w), hsf[v] = 1;
}
} else scanf("%lld%lld", &cst[i], &lim[i]);
}
for (int i = 1; i <= N; i++) if (!hsf[i]) addedge(0, i, 0);
dfs(0);
for (int i = 1; i <= M; i++) ans = max(ans, f[0][0][i]);
printf("%lld\n", ans);
return 0;
}
这里空空如也
有帮助,赞一个