您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: