列表

详情


NC54286. AK之旅

描述

他(她)沉迷游戏不能自拔,在比赛前的若干天偶然得知程序设计大赛,并了解到中意的妹子(汉子)也参加了这个比赛,从此浪子回头,采用最高效的方式学习算法,走上AK之旅(AK指比赛中的所有题都做对了)。

为简化难度,所有算法知识及其关系可以用一棵树来表示。这棵树有个节点,编号分别为。对于编号为的节点,代表算法,如果掌握了算法,则有价值。根据树的定义,树有条边,它们不构成回路,编号分别为。对于编号为的边,端点为(在树中,的父亲),长度为,代表如果掌握了算法,则可以花费的时间,掌握算法。在时刻,在爱的力量下,你掌握了根节点的算法,而其它算法暂时都不会。请问他在时刻后,最大的值是多少(,如果掌握算法,则为1,否则为0)。

今天,他AK了所有的题目。

祝大家前程似锦,AK所有比赛!不过相比比赛,头发和妹子(汉子)才是最重要的哒!

输入描述

行,输入两个整数

接下来行,第行输入一个整数

接下来行,第行输入三个整数

输出描述

输出一个整数,为对应的最大的值。

示例1

输入:

4 12
1 5 2 10
1 2 10
1 3 6
3 4 6

输出:

13

说明:

选择节点\, 1,3,4 \,
AK=v_{1}+v_{3}+v_{4}=1+2+10=13
Time=len(1,3)+len(3,4)=6+6=12 \le 12 = t
当前情况为满足条件下的值最大的情况。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 35ms, 内存消耗: 760K, 提交时间: 2019-10-26 16:19:19

#include<bits/stdc++.h>
#define M 305
using namespace std;
int n,T,A[M],dp[M][M];
bool in[M];
struct hzl {
	int a,b;
};
vector<hzl>E[M];
void dfs(int x,int f,int d) {
	if(d>T)return;
//	printf("%d\n",x);
	dp[x][0]=A[x];
	int now=T-d;
	for(int i=0; i<E[x].size(); i++) {
		int v=E[x][i].a;
		if(v==f)continue;
		dfs(v,x,d+E[x][i].b);
//		printf("%d %d %d\n",x,now,E[x][i].b);
		for(int a=now; a>=E[x][i].b; a--)
			for(int b=0; b<=a-E[x][i].b; b++)
			dp[x][a]=max(dp[x][a],dp[x][a-b-E[x][i].b]+dp[v][b]);
	}
	for(int i=1; i<=now; i++)dp[x][i]=max(dp[x][i],dp[x][i-1]);
	return ;
}
int main() {
	scanf("%d%d",&n,&T);
	for(int i=1; i<=n; i++)scanf("%d",&A[i]);
	for(int i=2; i<=n; i++) {
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		E[x].push_back((hzl) {
			y,z
		});
//		E[y].push_back((hzl) {
//			x,z
//		});
		in[y]=1;
	}
	for(int i=1; i<=n; i++)
		if(!in[i]) {
			dfs(i,0,0);
			printf("%d\n",dp[i][T]);
		}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 30ms, 内存消耗: 608K, 提交时间: 2019-10-29 11:26:39

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,t;
int head[310],to[310],ne[310],w[310],cnt=0;
void add(int u,int v,int val){
	cnt++;
	to[cnt]=v;
	w[cnt]=val;
	ne[cnt]=head[u];
	head[u]=cnt;
}
int v[310];
int f[310][310]={0};
void dfs(int r,int tt){
	if(tt<0)return;
	for(int i=head[r];i!=-1;i=ne[i]){
		dfs(to[i],tt-w[i]);
		for(int j=tt;j>=w[i];j--){
			for(int k=w[i];k<=j;k++){
				f[r][j]=max(f[r][j],f[r][j-k]+f[to[i]][k-w[i]]+v[to[i]]);
			}
		}
	}
}
bool vis[310]={0};
int main(){
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++)scanf("%d",&v[i]);
	for(int i=1;i<=n-1;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		vis[y]=1;
	}
	int root; 
	for(int i=1;i<=n;i++){
		if(vis[i]==0){
			root=i;
			break;
		}
	}
	dfs(root,t);
	f[root][t]+=v[root];
	printf("%d",f[root][t]);
	return 0;
}

上一题