NC221821. dd爱探险
描述
输入描述
第一行一个数n(3≤n≤16)
接下来n行每行n个数,第x行第y个数表示p[x][y](0≤p[x][y]≤100000)
输出描述
一个数,表示最小代价
示例1
输入:
3 0 2 1 2 0 1 3 1 0
输出:
2
说明:
1->2重力加速C++ 解法, 执行用时: 473ms, 内存消耗: 16848K, 提交时间: 2021-05-28 21:01:54
#include<bits/stdc++.h> using namespace std; const int N=16; int dp[N][4][1<<N]; int p[N][N]; int n; int dfs(int u,int b,int st){ if(b==0&&(st==(1<<n)-1))return 0; if(dp[u][b][st]!=-1)return dp[u][b][st]; int res=1e9; for(int v=0;v<n;v++){ if(st&(1<<v))continue; int nst=st|(1<<v); if(b&1)res=min(res,dfs(v,b&(~1),nst)+2*p[u][v]); if(b&2)res=min(res,dfs(v,b&(~2),nst)); res=min(res,dfs(v,b,nst)+p[u][v]); } return dp[u][b][st]=res; } int main(){ cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>p[i][j]; } } memset(dp,-1,sizeof dp); int ans=1e9; for(int i=0;i<n;i++){ ans=min(ans,dfs(i,3,1<<i)); } cout<<ans; }