結果
| 問題 |
No.417 チューリップバブル
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2021-01-10 18:23:13 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,118 bytes |
| コンパイル時間 | 151 ms |
| コンパイル使用メモリ | 82,408 KB |
| 実行使用メモリ | 72,028 KB |
| 最終ジャッジ日時 | 2024-11-21 07:12:05 |
| 合計ジャッジ時間 | 3,706 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 39 RE * 1 |
ソースコード
import sys
input = sys.stdin.buffer.readline
sys.setrecursionlimit(10 ** 7)
inf = 10**9
N, M = map(int, input().split())
U = [int(input()) for _ in range(N)]
g = [[] for _ in range(N)]
for _ in range(N - 1):
a, b, c = map(int, input().split())
g[a].append((b, c))
g[b].append((a, c))
topo = []
par = [-1] * N
que = [0]
while que:
s = que.pop()
topo.append(s)
for t, c in g[s]:
if t == par[s]:
continue
par[t] = s
que.append(t)
dp = [[0] for _ in range(N)]
for s in topo[::-1]:
for t, c in g[s]:
if t == par[s]:
continue
c *= 2
dpt = [0] * (len(dp[t]) + c)
for i, v in enumerate(dp[t]):
dpt[i + c] = v
if len(dpt) > M + 1:
dpt = dpt[:M + 1]
merge = [0] * (len(dp[s]) + len(dpt) - 1)
for i, v in enumerate(dp[s]):
for j, w in enumerate(dpt):
merge[i + j] = max(merge[i + j], v + w)
if len(merge) > M + 1:
merge = merge[:M + 1]
dp[s] = merge
u = U[s]
dp[s] = [u + v for v in dp[s]]
print(dp[0][M])
tktk_snsn