第二题:挖地雷(拓扑图+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;
}


 

...全文
37 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
高校算法学习社区
加入

1.7w+

社区成员

和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
社区管理员
  • 执 梗
  • 京与旧铺
  • 小袁ITSuper
帖子事件
创建了帖子
2022-05-14 16:08
社区公告

为了充分激发大家的创作热情和发文贡献,这里规定了高效算法学习社区对于积分榜的贡献排行榜的奖措施:

总榜奖励:(截止于2023年4月1日)

1.总榜第一:现金三百元

2.总榜第二与第三:Acwing算法课一套(价值150元可提现)

月榜:(从2020.年4月1日开始,每月一号结算)

1.月榜前三:请喝奶茶一杯

更多详细可看下:https://docs.qq.com/doc/DVnZJbkFPc1BNU2x2