最优贸易(记忆化搜索)

简介: 最优贸易(记忆化搜索)

题目链接:[NOIP2009 提高组] 最优贸易 - 洛谷


思路:这道题的标签是SPFA,但是我觉得这道题可以用记忆化搜索,用两组dfs,将从1到 i点道路上的最小值都存进min数组,将i 到n点的最大值存进max组,最后遍历min与max两数组的最大差值,输出即可。其中借助vector容器将每个点连通的点都遍历到。


AC代码:


#include<bits/stdc++.h>
using namespace std;
vector<int>way_min[110000];
vector<int>way_max[110000];
int value[110000],minn[110000],maxx[110000];
void dfs_min(int x,int m)
{ 
  if(m>=minn[x])
  return ;
  m=min(m,value[x]);
  minn[x]=m;
  for(int i=0;i<way_min[x].size();i++)
  {
  dfs_min(way_min[x][i],m);
  }
}
void dfs_max(int x,int m)
{
  if(m<=maxx[x])
  return ;
  m=max(m,value[x]);
  maxx[x]=m;
  for(int i=0;i<way_max[x].size();i++)
  {
  dfs_max(way_max[x][i],m);
  }
}
int main()
{
  int n,m,x,y,z,ans=0;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
  cin>>value[i];
  minn[i]=1000;
  maxx[i]=-1000;
  }
  for(int i=1;i<=m;i++)
  {
  cin>>x>>y>>z;
  way_min[x].push_back(y);
  way_max[y].push_back(x);
  if(z==2)
  {
    way_min[y].push_back(x);
    way_max[x].push_back(y);
  }
  }
  dfs_min(1,value[1]);
  dfs_max(n,value[n]);
  for(int i=1;i<=n;i++)
  ans=max(ans,maxx[i]-minn[i]);
  cout<<ans<<endl;
  return 0;
}

目录
相关文章
|
7月前
|
数据采集 监控 算法
应用动态规划算法解决可转债软件中的最优买卖时机问题
使用动态规划算法解决可转债市场的最佳买卖时机问题。定义状态dp[i][0](持有可转债的最大利润)和dp[i][1](不持有可转债的最大利润),通过状态转移方程更新状态,以max函数求解。提供的Python代码示例展示了如何计算最大利润。将此算法集成到软件中,结合网络爬虫获取实时价格,自动计算并提供买卖建议,助力投资者做出更明智的决策。
134 0
|
7月前
|
测试技术 Windows
【动态规划】879. 盈利计划
【动态规划】879. 盈利计划
|
7月前
|
人工智能 BI 测试技术
【图论】【树形dp】【深度优先搜索】2538. 最大价值和与最小价值和的差值
【图论】【树形dp】【深度优先搜索】2538. 最大价值和与最小价值和的差值
|
7月前
|
算法 Python
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
88 0
|
算法 Go 索引
870. 优势洗牌:田忌赛马:贪心算法+双指针
这是 力扣上的 870. 优势洗牌,难度为 中等。
132 0
|
机器学习/深度学习 算法
算法|计算汽车路程最短路径
算法|计算汽车路程最短路径
126 0
|
算法 数据格式 异构计算
|
算法
算法简单题,吾辈重拳出击 - 爬楼梯的最少成本
爬楼梯都还记得吧?f(x)=f(x-1)+f(x-2),斐波那契数列。 本题是爬楼梯的变形题:爬楼梯的最少成本
|
算法
算法简单题,吾辈重拳出击 - 动态规划之爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?