梦,才是最真的现实

导航

状态压缩 DP AHU420

#include<stdio.h>
#include<string.h>
#define INF 1<<29
int dp[32768][15];//第一维当前状态    第二维为现在所在位置  
int start[32768][15];
int bit_mask[30];
int map[16][16];
int main()
{
	int n,i,j,k,newi,begin,min;
	bit_mask[0]=1;
	for(i=1;i<30;i++)
		bit_mask[i]=bit_mask[i-1]<<1;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<bit_mask[n];i++)
			for(j=0;j<n;j++)
				dp[i][j]=INF;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				scanf("%d",&map[i][j]);
		for(i=0;i<n;i++)
		{
			dp[0][i]=0;
			start[0][i]=i;
		}
		for(i=0;i<bit_mask[n];i++)
		{
			for(k=0;k<n;k++)
			{
				for(j=0;j<n;j++)
				{
					if((i&bit_mask[j])==0)
					{
						newi=i|bit_mask[j];
						if(dp[i][k]+map[k][j]<dp[newi][j])
						{
							dp[newi][j]=dp[i][k]+map[k][j];
							start[newi][j]=start[i][k];
						}
					}
				}
			}
		}
		min=INF;
		for(i=0;i<n;i++)
		{
			begin=start[bit_mask[n]-1][i];
	//		printf("BEGIN:%d\n",begin);
			dp[bit_mask[n]-1][i]+=map[begin][i];
			if(dp[bit_mask[n]-1][i]<min)
				min=dp[bit_mask[n]-1][i];
		}
		printf("%d\n",min);
	}
	return 0;
}


posted on 2012-07-12 01:06  梦,才是最真的现实  阅读(152)  评论(0编辑  收藏  举报