记忆化搜索的复杂度是状态数量的多少吧?2^20*20应该可以过啊,想请问各位大佬记忆化搜索和状压dp的复杂度不一样吗
#include <bits/stdc++.h>
using namespace std;
int n;
int dis[21][21];
int ans=1000000000;
int vis[21];
int data[1<<20][21];//记录状态为i,最后访问的点是j的最小代价
long long status_end=(1<<n)-1;
//深搜 last记录上个点 status记录状态,即已经访问过的点
//now记录当前的距离
void dfs(int last,long long status,int now){
if(now>=ans){
return ;
}
if(data[status][last]<=now){
return ;
}else{
data[status][last]=now;
}
if(status==status_end){
ans=min(ans,now+dis[last][1]);
return ;
}
for(int i=2;i<=n;i++){
if(!vis[i]){
vis[i]=1;
dfs(i,status|(1<<(i-1)),now+dis[last][i]);
vis[i]=0;
}
}
return ;
}
int main (){
scanf("%d",&n);
status_end=(1<<n)-1;
memset(data,0x3f3f,sizeof(data));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&dis[i][j]);
}
}
vis[1]=1;
dfs(1,1,0);
printf("%d\n",ans);
return 0;
}