DAG上找一条最长路径

dp[i]表示从i点出发能找到的最长路径
那么对于dp[i]来说,那可以由它的后继节点(拓扑序大的)转移过来:
dp[i] = max(dp[i],dp[t]+val(i,t)) t为所有的后继节点。
这样操作就免去了拓扑排序的这一步骤,而且很显然我们需要用记忆化搜索的方式自顶向下的更新状态。
对于这种边界状态较难枚举的,用自顶向下的方式其实更好实现!!!

ll dp[maxn];
ll find(int x)
{
	if( dp[x] != -1 ) return dp[x];      //-1代表当前状态还不可达
	for (int i = 0; i < gx[x].size(); i++)
	{
		int t = gx[x][i].id;
		dp[x] = max(dp[x],find(t)+gx[x][i].val);
	}
	return dp[x];
}
发布了103 篇原创文章 · 获赞 6 · 访问量 7027

猜你喜欢

转载自blog.csdn.net/weixin_44316314/article/details/104253953