第二题:挖地雷(拓扑图+dp)

yuriwkt 2022-05-14 16:08:53

这道题一看就是拓扑排序的性质,首先他强调了并规定路径都是单向的,而且无环,那么我们就可以利用拓扑排序的性质来做这道题(做完后我看了一下标签,拓扑图,果然如此)。先对它进行拓扑排序,然后从后往前的递推公式

递推公式如下  dp[u]=max(dp[u],dp[v]),最后加上自己这个节点的地雷数,不过这道还需要输出路径,开个path数组,记录一下,没什么时间,代码写的比较糙。

AC代码如下:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int d[201];
vector<int> e[201];
int a[201];
int seq[201];
int dp[201];
int path[201]={0};
int topsort(int n)
{
	queue<int> que;
	for(int i=1;i<=n;i++)
	{
		if(d[i]==0)
		que.push(i);
	}
	int cnt=0;
	while(!que.empty())
	{
		int top=que.front();
		seq[cnt++]=top;
		que.pop();	
		for(int i=0;i<e[top].size();i++)
		{
			int v=e[top][i];
			d[v]--;
			if(d[v]==0)
			{
				que.push(v);
			}
		}
	}
	return cnt;
} 
int main()
{
	int n,i;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int c,b;
	cin>>b>>c;
	while(b)
	{
		e[b].push_back(c);
		d[c]++;
		cin>>b>>c;
	}
	topsort(n);
	int res=0,p;
	for(i=n-1;i>=0;i--)
	{
		dp[ seq[i] ]=0;
		for(int j=0;j<e[seq[i]].size();j++)
		{
			int v=e[seq[i] ][j];
			if(dp[v]>dp[seq[i]] )
			{
				dp[seq[i]]=dp[v];
				path[ seq[i] ]=v;
			}
			
		}
		dp[ seq[i] ]+=a[seq[i]];
		if(res<dp[ seq[i] ])
		{
			res=dp[ seq[i] ];
			p=seq[i];
		}
		
	}

	while(p)
	{
		cout<<p;
		p=path[p];
		if(p==0)
		{
			break;
		}
		cout<<"-";
		
	}
	cout<<endl;
	cout<<res<<endl;
	return 0;
}


 

...全文
75 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

50,782

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

试试用AI创作助手写篇文章吧