为什么记忆化搜索过不了
查看原帖
为什么记忆化搜索过不了
1103294
yuanshuu楼主2024/11/22 16:39

记忆化搜索的复杂度是状态数量的多少吧?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;
}
2024/11/22 16:39
加载中...