1 条题解

  • 1
    @ 2026-9-11 11:57:30

    番外:

    这个题目在洛谷上是一道紫题,我也是看了看题解才过的,然后洛谷上的第一篇题解代码很短,但是我看不懂,所以选择了第二篇,在这里记录一下。

    正文:

    用 DP 做。

    dpi,xdp_{i,x} 表示把 ii 个盘子从 xx 移到别的柱子的步数。dp1i,xdp1_{i,x} 代表第 ii 个盘子要移到哪个柱子。

    接下来考虑把上面 i1i-1 个盘子移到 dpi1dp_{i-1},再把剩下 11 个移到 kk

    接下来判断:当 dp1i1,dp1i1,j==jdp1_{i-1,dp1{i-1,j}}==j 时:先把 i1i-1 个移回 jj,再把第 11 个移动到 dp1i1,jdp1_{i-1,j},再把 i1i-1 个移动到 dp1i1,jdp1_{i-1,j}

    dp1i1,dp1i1,j=6jdp1i1,jdp1_{i-1,dp1_{i-1,j}}=6-j-dp1_{i-1,j} 时:直接把 i1i-1 个移到 6jdp1i1,j6-j-dp1_{i-1,j}

    dpi,j=dpi1,j+1+dpi1,dp1i1,jdp_{i,j}=dp_{i-1,j}+1+dp_{i-1,dp1_{i-1,j}}

    且:

    dp1i,j=dp1i1,jdp1_{i,j}=dp1_{i-1,j}

    这道题就结束了。

    Code:

    #include<bits/stdc++.h>
    #define int long long
    #define I_love_ch ios::sync_with_stdio(0)
    #define China cin.tie(0)
    #define France cout.tie(0)
    #define ch_France return 0
    using namespace std;
    int n,dp[110][4],dp1[110][4];
    string s;
    bool vis[110];
    signed main(){
    	I_love_ch;
    	China;
    	France;
    	cin>>n;
    	for(int i=1;i<=6;i++){
    		cin>>s;
    		int st=s[0]-'A'+1,end=s[1]-'A'+1;
    		if(vis[st]) continue;
    		vis[st]=1;
    		dp1[1][st]=end;
    		dp[1][st]=1;
    	}
    	for(int i=2;i<=n;i++){
    		for(int j=1;j<=3;j++){
    			if(dp1[i-1][dp1[i-1][j]]==j){
    				dp[i][j]=dp[i-1][j]*2+dp[i-1][dp1[i-1][j]]+2;
    				dp1[i][j]=dp1[i-1][j];
    			}
    			if(dp1[i-1][dp1[i-1][j]]==6-j-dp1[i-1][j]){
    				dp[i][j]=dp[i-1][j]+dp[i-1][dp1[i-1][j]]+1;
    				dp1[i][j]=6-j-dp1[i-1][j];
    			}
    		}
    	}
    	cout<<dp[n][1]<<"\n";
    	ch_France;
    }
    
    • 1

    信息

    ID
    850
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者