标签:des style blog http color io os ar java
感觉这两天怎么老是遇到状压啊。。。。
数字20以下,首想状压啊、、、
不过这题犯抽忘记考虑没有石头的时候了啊。
简单的状压:表示状态为j时以第i的作为结束。
PS:这题也在表扬大蓝翔的挖掘机技术啊。醉了啊。。。
3 3 0 0 0 0 100 0 0 0 0 2 2 1 1 1 1
4 4
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-8
#define M 1000100
#define LL __int64
//#define LL long long
#define INF 0x3f3f3f
#define PI 3.1415926535898
const int maxn = 55;
int mp[maxn][maxn];
int n, m;
int dis[maxn][maxn];
using namespace std;
int dp[12][1<<12];
struct node
{
int x, y;
} f[12];
int main()
{
while(~scanf("%d %d", &n, &m))
{
int ans = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j])
{
f[ans].x = i;
f[ans++].y = j;
}
}
}
memset(dis, 0, sizeof(dis));
for(int i = 0; i < ans; i++)
for(int j = 0; j < ans; j++) dis[i][j] = (abs(f[i].x-f[j].x)+abs(f[i].y-f[j].y));
for(int i = 0; i < ans; i++)
for(int j = 0; j < (1<<ans); j++) dp[i][j] = INF;
for(int i = 0; i < ans; i++) dp[i][(1<<i)] = (abs(f[i].x-1)+abs(f[i].y-1));
for(int j = 0; j < (1<<ans); j++)
{
for(int k = 0; k < ans; k++)
{
if(!(j&(1<<k))) continue;
for(int p = 0; p < ans; p++)
{
if(j&(1<<p)) continue;
dp[p][j|(1<<p)] = min(dp[k][j] + dis[k][p], dp[p][j|(1<<p)]);
}
}
}
int Min = INF;
for(int i = 0; i < ans; i++) Min = min(Min, dp[i][(1<<ans)-1]+abs(f[i].x-1)+abs(f[i].y-1));
if(Min == INF) Min = 0;
printf("%d\n",Min);
}
return 0;
}
HDU 5067 Harry And Dig Machine(状压dp)
标签:des style blog http color io os ar java
原文地址:http://blog.csdn.net/xu12110501127/article/details/40297309