BestCoder Round #14 B 称号 Harry And Dig Machine 【TSP】
2015-09-27 12:45
337 查看
称号:Harry And Dig Machine
哈哈 最终涨边粉色了,不easy呀。顺便写一道题解吧
题意:给一个m*n的矩阵,然后当中最多由10个有值,求总左上角把全部的值都拿上回到左上角的最小步数。
标准的TSP回到原点问题,须要先预处理出图来。然后TSP就可以。
AC代码:
哈哈 最终涨边粉色了,不easy呀。顺便写一道题解吧
题意:给一个m*n的矩阵,然后当中最多由10个有值,求总左上角把全部的值都拿上回到左上角的最小步数。
标准的TSP回到原点问题,须要先预处理出图来。然后TSP就可以。
AC代码:
#include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <iostream> #include <vector> #include <cmath> using namespace std; const int inf = 0x3f3f3f3f; const int N = 15; int mp ; struct Node { int x,y; }; vector<Node> vv; int n,m; int dp[1<<N] ; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++){ int x; scanf("%d",&x); if(x) vv.push_back((Node){i,j}); } } int okk = 0; for(int i=0;i<vv.size();i++) { if(vv[i].x==0 && vv[i].y==0) { okk=1; continue; } } if(okk==0) vv.push_back((Node){0,0}); for(int i=0;i<vv.size();i++) { for(int j=0;j<vv.size();j++) { mp[i][j] = 0; if(i==j) continue; mp[i][j] = abs(vv[i].x-vv[j].x) + abs(vv[i].y-vv[j].y); } } int len = vv.size(); n = len; for(int st=0;st<(1<<n);st++) //TSP { for(int i=0;i<n;i++) { if((st&(1<<i))==0) //Ϊ0 continue; if(st==(1<<i)){ dp[st][i]=mp[0][i];continue; } dp[st][i]=inf; for(int j=0;j<n;j++) { if((st&(1<<j)) && i!=j)//Ϊ1 { dp[st][i]=min(dp[st&~(1<<i)][j]+mp[j][i],dp[st][i]); } } } } int ans=inf; for(int i=0;i<n;i++){ ans=min(ans,dp[(1<<n)-1][i]+mp[i][0]); } printf("%d\n",ans); vv.clear(); } return 0; }
相关文章推荐
- Apache模块 mod_expires
- 通过注册表查找oracle_home的位置
- 校验码——揭开海明校验码求解之谜
- linux profile vs .bashrc
- java servlet+oracle 新手可看
- LeetCode Permutations II
- javascript中的算数运算
- 又是一年中秋时
- 秒拍产品分析
- 标 题: JavaScript真的要一统江湖了
- spring4mvc+hibernate4整合
- 初识正则表达式
- OpenCV_连通区域分析(Connected Component Analysis/Labeling)
- 初识正则表达式
- iOS开发中虚拟键盘相关的坑
- 软件测试工程师的技能
- Telnet 服务器软件的安装
- 图形学 图形渲染管线
- swift继承自Objective-C基类时重载方法报错的问题
- VC编程DLL通知应用程序exe通信(使用自定义消息实现)