#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=11,M=1<<N;
int G[N][N];
int dp[M][N];
int n;
int main()
{
while(scanf("%d",&n),n)
{
memset(dp,0x3f,sizeof dp);
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
scanf("%d",&G[i][j]);
for(int k=0; k<=n; k++)
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
for(int i=0; i<=n; i++)
dp[1<<i][i]=G[0][i];
for(int i=0; i<=(1<<(n+1))-1; i++)
for(int j=0; j<=n; j++)
if((i>>j)&1)
for(int k=0; k<=n; k++)
if(((i^(1<<j))>>k)&1)
dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+G[k][j]);
int ans=0x3f3f3f3f;
for(int i=0; i<=n; i++)
ans=min(ans,dp[(1<<(n+1))-1][i]+G[i][0]);
printf("%d\n",ans);
}
return 0;
}
【POJ3311】Hie With The Pie 状压dp
猜你喜欢
转载自blog.csdn.net/qq_44086097/article/details/104194417
今日推荐
周排行