1 条题解
-
1
番外:
这个题目在洛谷上是一道紫题,我也是看了看题解才过的,然后洛谷上的第一篇题解代码很短,但是我看不懂,所以选择了第二篇,在这里记录一下。
正文:
用 DP 做。
设 表示把 个盘子从 移到别的柱子的步数。 代表第 个盘子要移到哪个柱子。
接下来考虑把上面 个盘子移到 ,再把剩下 个移到 。
接下来判断:当 时:先把 个移回 ,再把第 个移动到 ,再把 个移动到 。
当 时:直接把 个移到 :
且:
这道题就结束了。
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
- 上传者