求助90pts,TLE
查看原帖
求助90pts,TLE
537046
大眼仔Happy楼主2023/3/6 13:26

是不是记忆化的问题(直接脱掉函数会快多少)

#include<bits/stdc++.h>
using namespace std;
const int N=25,NN=(1<<20)+5;
int n,EndSta;
int a[N][N];
int f[N][NN];
bool vis[N][NN];
int dfs(int la,int sta)//最后一步为la,当前状态为sta 
{
	if(sta==EndSta)return a[la][1];
	if(vis[la][sta])return f[la][sta];
	vis[la][sta]=1;
	for(int i=2;i<=n;i++)
	{
//		printf("%d %d %d\n",sta,1<<i,sta&(1<<i));
		if((sta&(1<<i))==0)//未走过i 
		{
//			printf("%d %d\n",sta,i);
			f[la][sta]=min(f[la][sta],dfs(i,sta|(1<<i))+a[la][i]);
		}
	}
	return f[la][sta];
}
int main(){
	scanf("%d",&n);memset(f,123,sizeof(f));
	EndSta=(1<<n+1)-2;
//	cout<<EndSta<<"\n";
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	printf("%d",dfs(1,2));
	return 0;
}
2023/3/6 13:26
加载中...