为啥加强版对了这个没对啊?
查看原帖
为啥加强版对了这个没对啊?
750869
Michael_Liu楼主2023/9/6 20:04
#include <bits/stdc++.h>
using namespace std;
const int L=310;
const int N=3005;
int q[N],dp[2][L][L],cost[L][L];
int X[N],Y[N];
unsigned char c[N][L][L];
int t,n,l;

inline void solve()
{
	int t=0;
	for(int i=0;i<n;i++)
	{
		memset(dp[t^1],0x3f,sizeof(dp[t^1]));
		for(int j=1;j<=l;j++)
		{
			for(int k=1;k<=l;k++)
			{
				if(j==k||j==q[i]||k==q[i]) continue;
				if(q[i]!=j&&q[i]!=q[i+1])
				{
					int sum=dp[t][j][k]+cost[k][q[i+1]];
					if(dp[t^1][j][q[i]]>sum)
					{
						dp[t^1][j][q[i]]=sum;
						c[i+1][j][q[i]]=k;
					}
				}
				if(q[i+1]!=k&&q[i]!=q[i+1])
				{
					int sum=dp[t][j][k]+cost[j][q[i+1]];
					if(dp[t^1][q[i]][k]>sum)
					{
						dp[t^1][q[i]][k]=sum;
						c[i+1][q[i]][k]=j;
					}
				}
				if(q[i+1]!=j&&q[i+1]!=k)
				{
					int sum=dp[t][j][k]+cost[q[i]][q[i+1]];
					if(dp[t^1][j][k]>sum)
					{
						dp[t^1][j][k]=sum;
						c[i+1][j][k]=0;
					}
				}
			}
		}
		t=t^1;
	}
	int ans=0x3f3f3f3f;
	int cntj=0,cntk=0;
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=l;j++)
		{
			if(ans>dp[t][i][j])
			{
				ans=dp[t][i][j];
				cntj=i;
				cntk=j;
			}
		}
	}
	cout<<ans<<endl;
	X[0]=1;Y[0]=2;
	for(int i=n;i>=1;i--)
	{
		int temp=c[i][cntj][cntk];
		X[i]=cntj;Y[i]=cntk;
		if(temp!=0)
		{
			if(cntj==q[i-1])
			{
				cntj=temp;
			}
			if(cntk==q[i-1])
			{
				cntk=temp;
			}
		}
	}
	int A=1,B=2;
	for(int i=1;i<=n;i++)
	{
		if(X[i]==q[i-1])
		{
			A=6-A-B;
		} 
		if(Y[i]==q[i-1])
		{
			B=6-A-B;
		}
		cout<<6-A-B<<" ";
	}
}

int main()
{
	q[0]=3;
	memset(dp,0x3f,sizeof(dp));
	dp[0][1][2]=0;
	cin>>l>>n;
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=l;j++)
		{
			cin>>cost[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		cin>>q[i];
	}
	solve();
	return 0;
}
2023/9/6 20:04
加载中...