标签:algorithm
3 3 0 0 0 0 100 0 0 0 0 2 2 1 1 1 1
4 4
知道是状压DP题,怎么都想不到思路,在最后写了个dfs交了一发,但写程序想到的剪枝忘写了,加上刚好结束,最后终测时TLE,加了剪枝就过了。由于就10个点,dfs复杂度为10!,再加个剪枝还是可以过的,状压DP的 还没会,先占个坑,会了再补上。
我的dfs代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[100][100];
struct node
{
int x;
int y;
}p[100];
int bbs(int x)
{
if(x<0)
return -x;
return x;
}
bool visit[100];
int t;
int ans;
void dfs(int v,int temp,node u)
{
if(temp>ans)//剪枝
return;
if(v==0)//递归出口
{
temp=temp+u.x+u.y;
if(temp<ans)
ans=temp;
return;
}
int yu;
for(int i=0;i<t;i++)
{
if(visit[i]==false)
{
yu=temp+bbs(p[i].x-u.x)+bbs(p[i].y-u.y);
visit[i]=true;
dfs(v-1,yu,p[i]);
visit[i]=false;
}
}
return;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int w;
t=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&w);
if(j==0&&i==0)
continue;
if(w)
{
p[t].x=i;
p[t++].y=j;
}
}
memset(visit,false,sizeof(visit));
ans=99999999;
int temp=0;
node u;
u.x=0;
u.y=0;
dfs(t,temp,u);
printf("%d\n",ans);
}
return 0;
}
hdu 5067 Harry And Dig Machine(BestCoder Round #14)
标签:algorithm
原文地址:http://blog.csdn.net/caduca/article/details/40259777