题意:
有权值的汉若塔问题,问怎样完成任务使得花费最小。
思路:
就是一个简单的dp,有两种转移,
1. dp[x][a][c]=dp[x-1][a][b]+cost[a][c]+dfs[x-1][b][c];
2. dp[x][a][c]=dp[x-1][a][c]+cost[a][b]+dp[x-1][c][a]+cost[b][c]+dp[x-1][a][c];
很好理解,不用解释了。
感想:
这场cf打的特不在状态,第一题读了很久,题意还读错了,后来又读,想到暴力思路了还不敢下手写,怕TLE,写了特判还错了,WA了一次,以为是精度问题还瞎改了一会。。。 = = 第二题也是瞎想,最后想到思路了,好简单的样子,但没时间了。。。跪了,好吧,这不是借口,实力太菜,没办法,又掉到1700以下了。。。加油吧,快点能稳定在1700吧。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 205
#define MAXN 1005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
ll n,m,k,ans,cnt,tot,flag;
ll cost[4][4],dp[45][4][4];
ll dfs(ll x,ll a,ll c)
{
if(x==0) return 0;
if(dp[x][a][c]!=m) return dp[x][a][c];
ll i,j,t,b,best=m;
b=6-a-c;
t=dfs(x-1,a,b)+cost[a][c]+dfs(x-1,b,c);
best=min(best,t);
t=2*dfs(x-1,a,c)+cost[a][b]+dfs(x-1,c,a)+cost[b][c];
best=min(best,t);
dp[x][a][c]=best;
return best;
}
int main()
{
ll i,j,t;
m=1LL<<60;
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++)
{
scanf("%I64d",&cost[i][j]);
}
}
scanf("%I64d",&n);
for(i=1;i<=n;i++) for(j=1;j<=3;j++) for(int k=1;k<=3;k++) dp[i][j][k]=m;
ans=dfs(n,1,3);
printf("%I64d\n",ans);
return 0;
}