85pts 求助 悬2关
查看原帖
85pts 求助 悬2关
569235
w9095楼主2024/11/20 11:19
#include <bits/stdc++.h>
using namespace std;
long long n,x,a[20][20],t[20][20],p[20][20],len[20],se[20],f[1100][12][12][12][12],ans=1e18;
long long check(long long x,long long y)
{
	if((se[x]&se[y])!=se[y])return 1e18;
	long long now=p[y][a[x][len[x]]];
	for(int i=len[x]-1;i>=1;i--)
	    if(now==0)return i+1;
	    else if(p[y][a[x][i]]>now)return i;
	    else now=p[y][a[x][i]];
	return 0;
}

int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        while(scanf("%lld",&x)&&x)a[i][++len[i]]=x,p[i][x]=len[i],se[i]|=(1<<(x-1));
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++)
	        if(i!=j)t[i][j]=check(i,j);
	        else t[i][j]=1e18;
	for(int s=0;s<(1<<n);s++)
	    for(int i=1;i<=n+1;i++)
	        for(int l=len[i];l>=0;l--)
	            for(int j=1;j<=n+1;j++)
	                for(int r=1;r<=len[j]+1;r++)
	                    f[s][i][l][j][r]=1e18;
	f[0][n+1][0][n+1][1]=0;
	for(int i=1;i<=n;i++)f[1<<(i-1)][i][len[i]][n+1][1]=0;
	for(int s=0;s<(1<<n);s++)
	    for(int i=1;i<=n+1;i++)
	        for(int l=len[i];l>=0;l--)
	            for(int j=1;j<=n+1;j++)
	                for(int r=1;r<=len[j]+1;r++)
	                    {
	                    	if(f[s][i][l][j][r]>=1e18)continue;
	                    	if(s==(1<<n)-1&&l==0&&r==len[j]+1)ans=min(ans,f[s][i][l][j][r]);
	                    	for(int k=1;k<=n;k++)
	                    	    {
	                    	    	if((s>>(k-1))&1)continue;
	                    	    	if(i!=n+1&&l==0)
	                    	    	   for(long long x=t[k][i];x<=len[k];x++)f[s|(1<<(k-1))][k][x][j][r]=min(f[s|(1<<(k-1))][k][x][j][r],f[s][i][l][j][r]);
								    if(j==n+1||r>t[j][k])f[s|(1<<(k-1))][i][l][k][1]=min(f[s|(1<<(k-1))][i][l][k][1],f[s][i][l][j][r]);
								}
							if(i!=n+1&&l==0)f[s][n+1][0][j][r]=min(f[s][n+1][0][j][r],f[s][i][l][j][r]);
							for(int k=1;k<=9;k++)
							    {
							    	long long pl=0,pr=1;
							    	if(i==n+1)pl=0;
							    	else if(p[i][k]==0||p[i][k]>l)continue;
							    	else pl=l-(a[i][l]==k);
							    	if(j==n+1)pr=1;
							    	else if(p[j][k]==0||p[j][k]>r)continue;
							    	else pr=r+(a[j][r]==k);
							    	f[s][i][pl][j][pr]=min(f[s][i][pl][j][pr],f[s][i][l][j][r]+1);
								}
						}
	if(ans==1e18)printf("-1\n");
	else printf("%lld\n",ans);
	return 0;
}
2024/11/20 11:19
加载中...