树形dp是建立的树的基础上的有二叉和三叉等等树,现在学到的知识很简单的树形dp,但还是要注意深搜时要标记避免已经搜素得到过的结果可以直接用了不用在浪费时间去搜素了。还有就是对根节点的处理。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int dp[1005],flag[1005],cost[1005];
vector <int> g[1010];
void dfs(int x)
{
int k;
flag[x]=1; //已经搜过了,并且会不断搜,然后搜到结果
if(g[x].size()==0)
{
dp[x]=cost[x];
return ;
}
for(int i =0; i<g[x].size();i++)
{
k=g[x][i];
if(flag[k]==0) //还没有搜索过结果
dfs(k);
dp[x]=max(dp[x],cost[x]+dp[k]);
}
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
cost[0]=0;
for(int i =1; i<=n;i++)
{
scanf("%d",&cost[i]);
g[i].clear();
flag[i]=1; //注意memset只能初始化为0,-1,so
}
scanf("%d",&m);
while(m--)
{
int x, y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
flag[y]=0;
}
for(int i = 0;i < n; i++)
{
if(flag[i])
g[0].push_back(i); //存着根节点。这题存的是所有软件包的值,所以要把所有的跟节点的中国的最大值。
}
memset(flag ,0,sizeof(flag));
memset(dp,-1,sizeof(dp));
dfs(0); //从跟节点往下搜素出答案。
printf("%d\n",dp[0]);
}
return 0;
}