状态压缩dp,占个坑先。。。
状态转移方程如下:
占个坑先。。。
潜在优化:
- 占个坑先。。。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[20][(2 << 19)] = { 0 };
int dis[20][20] = { 0 };
int vnum;
int findans() {
memset(dp, 20000, sizeof(dp));
int col = (1 << (vnum - 1));
for (int j = 0; j < col; ++j) {
for (int i = 0; i < vnum; ++i) {
if (j == 0) dp[i][j] = dis[i][0];
if (j&(1 << (i - 1))) continue;
for (int m = 0; m < vnum - 1; ++m) {
int judge = 1 << m;
if (j&judge) {
int next = j & (~judge);
dp[i][j] = min(dp[i][j], dis[i][m + 1] + dp[m + 1][next]);
}
}
}
}
return dp[0][col - 1];
}
int main(){
cin >> vnum;
for (int i = 0; i < vnum; ++i) {
for (int j = 0; j < vnum; ++j) cin >> dis[i][j];
}
cout << findans() << endl;
return 0;
}