当前位置: 首页 > news >正文

D. Explorer Space(dfs+剪枝)

Problem - 1517D - Codeforces 

题目大意:给你一个n行m列的矩阵,以及每个点上下左右相邻点的边权,求出每个点任意走k步后再回到当前这个点的最小路程,如果不能回到起始点则输出-1

思路:既然走k步后要回到起始点,则k一定要为偶数,若为奇数则每个点输出-1,否则我们只需要求从起始点走k/2步的最小路程,注意这里不能使用Dijkstra,因为可以重复走某些点,Dijkstra走过的点如果不进行标记容易超时,所以我们考虑使用dfs+记忆化,设置一个记忆化数组dp[i][j][c]表示(i,j)这个位置再走c步的最小路程。

Code:

int n,m,k;
map<PII,int> mp;
int dp[505][505][25];
int ne[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int dfs(int x,int y,int c)
{if(c==0) return dp[x][y][c]=0;if(dp[x][y][c]) return dp[x][y][c];int mn=1e18;for(int i=0;i<4;i++){int tx=x+ne[i][0],ty=y+ne[i][1];if(tx>=1&&tx<=n&&ty>=1&&ty<=m){mn=min(mn,dfs(tx,ty,c-1)+mp[{(x-1)*m+y,(tx-1)*m+ty}]);}}return dp[x][y][c]=mn;
}
void solve()
{cin>>n>>m>>k;for(int i=1;i<=n;i++){for(int j=1;j<m;j++){int x;cin>>x;int a=(i-1)*m+j;int b=a+1;mp[{a,b}]=mp[{b,a}]=x; }}for(int i=1;i<n;i++){for(int j=1;j<=m;j++){int x;cin>>x;int a=(i-1)*m+j;int b=a+m;mp[{a,b}]=mp[{b,a}]=x;}}if(k&1){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<-1<<' ';cout<<endl;}return ;}k/=2;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<dfs(i,j,k)*2<<' ';}cout<<endl;}
}

 

相关文章:

  • 深入理解深度Q网络DQN:基于python从零实现
  • 三、c语言练习四题
  • 前端项目打包部署流程j
  • 无人机空中物流优化:用 Python 打造高效配送模型
  • 华为IP(6)
  • 中空电机在安装垂直轴高速电机后无法动平衡的原因及解决方案
  • 【网络】:传输层协议 —— UDP、TCP协议
  • Compose笔记(二十二)--NavController
  • 嵌入式硬件篇---SPI
  • 嵌入式硬件篇---陀螺仪|PID
  • 验证码与登录过程逻辑学习总结
  • Go语言——kratos微服务框架使用
  • Linux 进程控制 基础IO
  • 关系数据库-关系运算
  • Docker Compose 的历史和发展
  • C++ RAII机制
  • LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?
  • 深入解析PyTorch中MultiheadAttention的隐藏参数add_bias_kv与add_zero_attn
  • Redis 缓存
  • Python爬虫实战:研究网站动态滑块验证
  • 外交部亚洲司司长刘劲松会见印度驻华大使罗国栋
  • 工人日报:“鼠标手”被纳入职业病,劳动保障网越织越密
  • 某博主遭勒索后自杀系自导自演,成都警方立案调查
  • 韩国总统选战打响:7人角逐李在明领跑,执政党临阵换将陷入分裂
  • 上海能源科技发展有限公司原董事长李海瑜一审获刑13年
  • 尹锡悦涉嫌发动内乱案举行第三次庭审