这题一开始碰到简直蒙了,完全不造从何做起呢,后来学长让我欣赏了大白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;
}