被卡空间了,好难受,记忆化搜索过不了
查看原帖
被卡空间了,好难受,记忆化搜索过不了
383782
StarPatrick楼主2021/11/27 09:21
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
int n, w;
int cage[205][205], ques[1005];
int dp[1005][205][205];
inline int min(int x, int y)
{
	return x<y?x:y;
}
int dfs(int i, int u1, int u2)
{
	if (dp[i][u1][u2]!=-1)
	{
		return dp[i][u1][u2];
	}
	if (i==w+1)
	{
		return dp[i][u1][u2]=0;
	}
	int last = ques[i-1];
	if (last==ques[i])
	{
		return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, u1, u2);
	}
	if (u1==ques[i])
	{
		return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, last, u2);
	}
	if (u2==ques[i])
	{
		return dp[i][u1][u2]=dp[i][u2][u1]=dfs(i+1, u1, last);
	}
	return dp[i][u1][u2]=dp[i][u2][u1]=min(dfs(i+1, u1, u2)+cage[last][ques[i]], min(dfs(i+1, last, u2)+cage[u1][ques[i]], dfs(i+1, u1, last)+cage[u2][ques[i]]));
}
void print(int i, int u1, int u2, int n1, int n2)
{
	if (i==w+1)
	{
		return ;
	}
	int last = ques[i-1];
	if (last==ques[i])
	{
		cout<<6-n1-n2<<" ";
		print(i+1, u1, u2, n1, n2);
		return ;
	}
	if (u1==ques[i])
	{
		cout<<n1<<" ";
		print(i+1, last, u2, 6-n1-n2, n2);
		return ;
	}
	if (u2==ques[i])
	{
		cout<<n2<<" ";
		print(i+1, u1, last, n1, 6-n1-n2);
		return ;
	}
	if (dfs(i+1, u1, u2)+cage[last][ques[i]]<min(dfs(i+1, last, u2)+cage[u1][ques[i]], dfs(i+1, u1, last)+cage[u2][ques[i]]))
	{
		cout<<6-n1-n2<<" ";
		print(i+1, u1, u2, n1, n2);
	}
	else
	{
		if (dfs(i+1, last, u2)+cage[u1][ques[i]]<dfs(i+1, u1, last)+cage[u2][ques[i]])
		{
			cout<<n1<<" ";
			print(i+1, last, u2, 6-n1-n2, n2);
		}
		else
		{
			cout<<n2<<" ";
			print(i+1, u1, last, n1, 6-n1-n2);
		}
	}
}
int main()
{
	memset(dp, -1, sizeof(dp));
	cin>>n>>w;
	for (int p=1;p<=n;p++)
	{
		for (int k=1;k<=n;k++)
		{
			scanf("%d", &cage[p][k]);
		}
	}
	ques[0] = 1;
	for (int p=1;p<=w;p++)
	{
		scanf("%d", &ques[p]);
	}
	cout<<dfs(1, 2, 3)<<"\n";
	print(1, 2, 3, 2, 3);
	return 0;
}
2021/11/27 09:21
加载中...