hdu 5067 Harry And Dig Machine
2024-08-22 10:12:17
http://acm.hdu.edu.cn/showproblem.php?pid=5067
思路:问题可以转化成:从某一点出发,遍历网格上的一些点,每个点至少访问一次需要的最小时间是多少。这就是经典的旅行商问题,考虑到我们必须要遍历的点只有不到10个,可以用状态压缩解决。
dp[i][j]表示i状态的点被访问过了,当前停留在点j 需要的最少时间,状态转移方程:dp[i|(1<<k)][k]=min(dp[i|(1<<k)][k],dp[i][j]+abs(q[j].x-q[k].x)+abs(q[j].y-q[k].y));
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int inf=<<; int n,m;
int g[][];
int dp[<<][];
struct node
{
int x,y;
}st; int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
vector<node>q;
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
scanf("%d",&g[i][j]);
if(i==&&j==)
{
st.x=i;
st.y=j;
q.push_back(st);
}
else if(g[i][j])
{
st.x=i;
st.y=j;
q.push_back(st);
}
}
}
int x=q.size();
for(int i=; i<(<<x); i++)
{
for(int j=; j<x; j++)
{
dp[i][j]=inf;
}
}
dp[][]=;
for(int i=; i<(<<x); i++)
{
for(int j=; j<x; j++)
{
for(int k=; k<x; k++)
{
if((i&(<<k))) continue;
dp[i|(<<k)][k]=min(dp[i|(<<k)][k],dp[i][j]+abs(q[j].x-q[k].x)+abs(q[j].y-q[k].y));
}
}
}
printf("%d\n",dp[(<<x)-][]);
}
return ;
}
Dp[i|(1≪k)][k]=min(Dp[i|(1≪k)][k],Dp[i][j]+Dis(j,k))
最新文章
- Android开发 代替 “(XXXX)findViewById()”
- HTML JavaScripts
- 电子数字 网易游戏在线笔试 第一题 hihocoder
- 三角形变形记之纯css实现的分布导航条效果
- jQuery DOM基础
- 当今流行的 React.js 适用于怎样的 Web App?
- J - Fire!
- python 整数和浮点数
- 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&;amp;记忆化递归
- 浅谈java中的";==";和eqals区别
- MySQL 复制 - 性能与扩展性的基石 4:主备切换
- python学习日记(内置、匿名函数练习题)
- AI数据分析(一)
- Unity3D里怎样隐藏物体
- Servlet&#160;CDI&#160;Example&#160;Analysis
- CodeForces999E 双dfs // 标记覆盖 // tarjan缩点
- 20165235Linux安装及学习
- .5-浅析express源码之Router模块(1)-默认中间件
- Ignite内存数据库与sql支持
- Gitlab邮箱配置