首页 > 代码库 > SDUT 2895-D(记忆化搜索)

SDUT 2895-D(记忆化搜索)

题目链接:点击打开链接

题意:给出一棵含有n个点的树,每个点权值为wi,求从根节点到叶子结点权值和最大的那条路经的权值和是多少。

类似数塔,从顶自底记忆化搜。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 10005
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1<<40+10
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
int n,dp[10005],root;
vector <int> eg[10005];
int dfs(int u)
{
	int tem=0;
	for(int i=0;i<eg[u].size();i++)
		tem=max(tem,dfs(eg[u][i]));
	dp[u]+=tem;
	return dp[u];
}
int main()
{
	int u,c;
	while(~scanf("%d",&n))
	{
		for(int i=0;i<=n;i++)
			eg[i].clear();
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&u,&c);
			eg[u].push_back(i);
			if(u==0)root=i;
			dp[i]=c;
		}
		printf("%d\n",dfs(root));
	}
	return 0;
}


SDUT 2895-D(记忆化搜索)