HDOJ 5067Harry And Dig Machine(状态压缩DP)
2014-10-26 11:14
363 查看
题意:一个机器在(1,1)的位置,现在他要搜集矩阵中所有的垃圾(?)搜集不花时间,机器每移动相邻(4相邻)花费一个时间,问搜集全部的垃圾(!)又回到(1,1)需要花费多少时间;
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath> using namespace std; int B[30][30]; int A[50][50]; struct node{ int a; int b; }s[20]; int dp[20][4000]; int min(int a,int b) { return a > b ? b : a; } int main() { int n,m,i,j,tmp; while(scanf("%d %d",&n,&m)!=EOF) { for(i = 1;i <= n;i ++) for(j = 1;j <= m;j ++) cin >> A[i][j]; A[1][1] = 1;//因为从(1,1)出发所以,,, tmp = 0; for(i = 1;i <= n;i ++) for(j = 1;j <= m;j ++) if(A[i][j]) { s[++tmp].a = i; s[tmp].b = j; } for(i = 1;i <= tmp;i ++) for(j = 1;j <= tmp;j ++) B[i][j] = (abs(s[i].a - s[j].a) + abs(s[i].b - s[j].b)); for(int en = 1;en < (1 << tmp);en ++) for(i = 1;i <= tmp;i ++) if(en & (1 << (i -1))) { if(en == (1 << (i -1))) dp[i][en] = B[1][i]; else { dp[i][en] = 100000; for(j = 1;j <= tmp;j ++) if(en & (1 << (j - 1)) && j != i) { dp[i][en] = min(dp[i][en],dp[j][en ^ (1 << (i-1))] + B[j][i]); } } } int ans = 10000000; for(i = 1;i <= tmp;i ++) ans = min(ans,dp[i][(1 << tmp)-1] + B[i][1]); cout << ans << endl; } return 0; }
相关文章推荐
- 20140930 【 DP - 状态压缩 】 2014-上海区域赛-网络预选赛 hdoj 5045 Contest
- HDOJ 4057 - Rescue the Rabbit 简单的AC自动机+状态压缩DP
- HDOJ 2442 -bricks 状态压缩DP 一直TLE.打表过的..
- HDOJ-3427 & ZOJ-3190 Resource Archiver AC自动机压缩状态DP..
- hdoj&nbsp;4310&nbsp;Hero&nbsp;(状态压缩DP)
- HDOJ 4628 - Pieces 状态压缩DP..枚举所有子集进行更新
- hdoj 5045 (dp 状态压缩)
- HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP
- HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP
- HDOJ 4529 - N骑士问题 状态压缩DP
- 【最短路+状态压缩DP】 HDOJ 4856 Tunnels
- HDOJ 2442 -bricks 六进制状态压缩DP 一直TLE.打表过的..
- hdoj 5125 Little Zu Chongzhi's Triangles【状态压缩dp】
- hdoj 3341 Lost's revenge 【AC自动机 + 变进制状态压缩dp】
- hdoj 4336 card collector(状态压缩dp求数学期望)
- HDOJ 4310 - Hero 简单的状态压缩DP
- HDOJ 1565 方格取数(1)(状态压缩dp)
- hdoj1074 Doing Homework(好题呀,状态压缩+DP)
- HDOJ 2640 - Toy bricks 状态压缩DP
- hdoj 1074 Doing Homework 【状态压缩dp】