
算法:动态规划位操作压缩
题解:e[i][j] i表示路线 ,j表示终点 ,初始化e[1][0]=0,表示从0点出发。
例如:i=7,n=4,二进制为 0111 表示经过 点 0 1 2 。
点击查看代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int> pll;
typedef long long ll;
const int N=1e5+7;
int e[1<<20][20];
int a[21][21];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>a[i][j];
}
memset(e,0x3f,sizeof(e));
e[1][0]=0;
for(int i=0;i<1<<n;i++)//从小到大保证每一步都是最优解。
{
for(int j=0;j<n;j++)
{
if(i>>j&1)//确定从0点开始,结尾为j点
for(int k=0;k<n;k++)
if(i>>k&1)//中间线路包括 k点
e[i][j]=min(e[i][j],e[i-(1<<j)][k]+a[k][j]);//k点为倒数第二个点。
}
}
cout<<e[(1<<n)-1][n-1];
return 0;
}