結果
問題 | No.417 チューリップバブル |
ユーザー |
![]() |
提出日時 | 2020-01-05 19:56:16 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 736 ms / 2,000 ms |
コード長 | 2,315 bytes |
コンパイル時間 | 792 ms |
コンパイル使用メモリ | 86,248 KB |
実行使用メモリ | 5,760 KB |
最終ジャッジ日時 | 2024-11-22 23:29:22 |
合計ジャッジ時間 | 10,356 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
#include <iostream>#include<vector>#include<algorithm>#include<string>#include<map>#include<set>#include<stack>#include<queue>#include<math.h>using namespace std;typedef long long ll;#define int long longtypedef vector<int> VI;typedef pair<int, int> pii;#define fore(i,a) for(auto &i:a)#define REP(i,n) for(int i=0;i<n;i++)#define eREP(i,n) for(int i=0;i<=n;i++)#define FOR(i,a,b) for(int i=(a);i<(b);++i)#define eFOR(i,a,b) for(int i=(a);i<=(b);++i)#define SORT(c) sort((c).begin(),(c).end())#define rSORT(c) sort((c).rbegin(),(c).rend())#define LB(x,a) lower_bound((x).begin(),(x).end(),(a))#define UB(x,a) upper_bound((x).begin(),(x).end(),(a))#define INF 1000000000#define LLINF 9223372036854775807#define mod 1000000007//vector<vector<int> > dp;//vector<vector<vector<int> > > vvvi;//dp=vector<vector<int> >(N, vector<int>(M,0));//vector<pair<int,int> > v;//v.push_back(make_pair(x,y));//priority_queue<int,vector<int>, greater<int> > q2;int N, M;int V[210];struct edge { int to, cost; };vector<edge> G[210];int dp[210][2010];/*void dfs(int cu,int pa,int time,int val) {REP(i, G[cu].size()) {int to = G[cu][i].to;int cost = G[cu][i].cost;cout << cu << " " << to << " " << time + cost << endl;if (!vis[to]) {cost *= 2;val += V[to];vis[to] = true;}//if (to == pa)continue;//cout <<cu<<" "<<to<< " " << time + cost << endl;if (time + cost <= M) {dp[time + cost] = max(dp[time + cost], val);dfs(to, cu, time + cost, val);}}}*///cuで残り時間reの時の最大void dfs(int cu, int pa) {//if (dp[cu][re] != -1)return dp[cu][re];dp[cu][0] = V[cu];REP(p, G[cu].size()) {edge e = G[cu][p];if (e.to == pa)continue;dfs(e.to, cu);int c = e.cost;for (int j = M; j >= 0; j--) {eREP(k, M) {int t = j + c * 2 + k;if (t <= M)dp[cu][t] = max(dp[cu][t], dp[cu][j] + dp[e.to][k]);}}}}signed main(){cin.tie(0);ios::sync_with_stdio(false);cin >> N >> M;REP(i, N)cin >> V[i];REP(i, N - 1) {int a, b, c;cin >> a >> b >> c;edge e;e.to = a; e.cost = c;G[b].push_back(e);e.to = b;G[a].push_back(e);}dfs(0, -1);int ans = 0;eREP(i, M) {ans = max(ans, dp[0][i]);//cout << i<<" "<<dp[i] << endl;}cout << ans << endl;return 0;}