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))

最新文章

  1. Android开发 代替 “(XXXX)findViewById()”
  2. HTML JavaScripts
  3. 电子数字 网易游戏在线笔试 第一题 hihocoder
  4. 三角形变形记之纯css实现的分布导航条效果
  5. jQuery DOM基础
  6. 当今流行的 React.js 适用于怎样的 Web App?
  7. J - Fire!
  8. python 整数和浮点数
  9. 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;amp;记忆化递归
  10. 浅谈java中的&quot;==&quot;和eqals区别
  11. MySQL 复制 - 性能与扩展性的基石 4:主备切换
  12. python学习日记(内置、匿名函数练习题)
  13. AI数据分析(一)
  14. Unity3D里怎样隐藏物体
  15. Servlet&#160;CDI&#160;Example&#160;Analysis
  16. CodeForces999E 双dfs // 标记覆盖 // tarjan缩点
  17. 20165235Linux安装及学习
  18. .5-浅析express源码之Router模块(1)-默认中间件
  19. Ignite内存数据库与sql支持
  20. Gitlab邮箱配置

热门文章

  1. session原理解析
  2. SQL Server 2005恢复数据库详细图文教程
  3. ubuntu 12.04 编译安装 nginx
  4. eclipse中svn插件的安装
  5. ubuntu16.04 : 4: [: y: unexpected operator
  6. IIS Shared Configuration
  7. Js判断对象是否为空,Js判断字符串是否为空
  8. CenOs安装中文输入法
  9. 24种设计模式--建造者模式【Builder Pattern】
  10. ARM开发板系统移植-----u-boot的编译