这题一开始碰到简直蒙了,完全不造从何做起呢,后来学长让我欣赏了大白P26页那个汉诺塔,于是我有了一定的思路。
这题是个很漂亮的DP,状态转移方程太复杂了懒得写了,不过看代码也可以看懂哦。
#include<iostream> #include<cstdio> #include<cctype> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue> #include<map> #include<set> #include<sstream> #include<stack> using namespace std; #define MAX 105 typedef long long LL; const double pi=3.141592653589793; const int INF=1e9; const double inf=1e20; LL b[5][45][5]; LL a[5][5]; LL hanoi(int i,int j,int k) { if(b[i][j][k]>0) return b[i][j][k]; if(j==0) return b[i][j][k]=0; return b[i][j][k]=min(hanoi(i,j-1,6-i-k)+a[i][k]+hanoi(6-i-k,j-1,k),2*hanoi(i,j-1,k)+a[i][6-i-k]+hanoi(k,j-1,i)+a[6-i-k][k]); } int main() { int n; memset(b,0,sizeof(b)); for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) scanf("%I64d",&a[i][j]); } cin>>n; LL ans=min(hanoi(1,n-1,2)+a[1][3]+hanoi(2,n-1,3),2*hanoi(1,n-1,3)+a[1][2]+a[2][3]+hanoi(3,n-1,1)); printf("%I64d\n",ans); return 0; }