CF392B Tower of Hanoi

题意翻译

河内塔是一个众所周知的数学难题。它由三根杆和一些可以滑动到任何杆上的不同尺寸的圆盘组成。难题从一个整齐的杆中开始,按照尺寸从小到大的顺序排列,最小的位于顶部,从而形成一个圆锥形状。难题的目标是将整个杆移动到另一个杆,遵循以下简单规则:

  1. 一次只能移动一个圆盘。
  2. 每一步都是从其中一个杆取出上面的圆盘并将它放在另一个杆的顶部,即只有当圆盘是杆中最上面的圆盘时才能移动圆盘。
  3. 没有圆盘可能放置在较小的圆盘顶部。

有了三个圆盘,这个难题可以通过七个步骤解决。解决河内难题所需的最小移动次数是2^n - 1,其中n是圆盘的数量。 SmallY的难题非常类似于着名的河内塔。在河内之谜游戏中,你需要以最少的动作来解决难题,在SmallY的谜题中,每一个动作都需要花费一些钱,而且你需要解决同样的难题,但要花费最少。 在SmallY的难题开始时,所有的n个磁盘都在第一根杆上。将圆盘从杆i移动到杆j需要花费t[i,j]个金钱单位。(1 <= i,j <= 3).这个难题的目标是将所有的圆盘移动到第三个杆上。在这个问题中给出矩阵t和整数n。您需要计算解决SmallY难题的最小成本,其中包含n个圆盘。 输入输出格式输入格式:前三行中的每一行都包含三个整数 - 矩阵t。第i行第j个整数为t[i,j](1 <= t[ij] <= 10000; i≠j )。以下行包含一个整数n表示圆盘数量(1 <= n <= 40)。当i满足: (1 <= i <= 3), t[i,i] = 0. 输出格式:打印一个整数 - 解决SmallY难题的最低成本。

sol:dp[i][j][k]表示i个盘子,从j移到k,有两种方法,一种是传统的,另一种比较NB

例如从1到3 n个:1->2(n-1),1->3最大盘,2->3(n-1)

或者

1->3(n-1),1->2最大盘,3->1(n-1),2->3最大盘,1->3(n-1)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
int n;
ll tim[][],dp[][][];
int main()
{
// freopen("data.in","r",stdin);
int i,j,k;
memset(dp,,sizeof dp);
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
R(tim[i][j]); dp[][i][j]=;
}
}
R(n);
for(i=;i<=n;i++)
{
for(j=;j<=;j++) for(k=;k<=;k++) if(j!=k)
{
int oo=-j-k;
dp[i][j][k]=min(dp[i][j][k],dp[i-][j][oo]+tim[j][k]+dp[i-][oo][k]);
dp[i][j][k]=min(dp[i][j][k],dp[i][j][oo]+dp[i-][oo][j]+tim[oo][k]+dp[i-][j][k]);
dp[i][j][k]=min(dp[i][j][k],dp[i-][j][k]+tim[j][oo]+dp[i-][k][j]+tim[oo][k]+dp[i-][j][k]);
}
}
Wl(dp[n][][]);
return ;
}

codeforces392B的更多相关文章

随机推荐

  1. 使用vue-cli创建vue工程

    在Windows环境下,打开命令行窗口,跳转至想创建工程的路径. 如:D:\MyWork\22_Github\rexel-cn\rexel-jarvis 创建vue工程,命令:vue create r ...

  2. K最近邻算法项目实战

    这里我们用酒的分类来进行实战练习 下面来代码 1.把酒的数据集载入到项目中 from sklearn.datasets import load_wine #从sklearn的datasets模块载入数 ...

  3. MYSQL日期相关操作

    *******MYSQL中取当前周/月/季/年的第一天与最后一天******* 当年第一天: SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 ...

  4. 【数字图像处理】目标检测的图像特征提取之HOG特征

    1.HOG特征 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯 ...

  5. UITableView个人使用总结【前篇-增量加载】

    UITableView现在边整边总结. 预计分两个部分,第一个部分主要是对UITableView本身属性的学习.第二个部分可能会是加上一个编辑按钮以及对列表的操作. 今天先学习第一部分. 第一部分,我 ...

  6. Redis二进制安全概念

    二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改.破译等,如果被攻击,能够及时检测出来. 二进制安全包含了密码学的一些东西,比如加解密.签名等. 举个例子,你把数据1111000 ...

  7. python 解析Hdfs上的数据文件

    python想直接读取hadoop上的文件内容,一番操作,头发掉了几根,也没能解析出来parquet文件类型的文件. 本博文简单讲解一下TEXTFILE文件格式的解析: 需要安装模块hdfs from ...

  8. 跟着minium官网介绍学习minium-----(三)

    注意:程序运行时在微信开发者工具当前页面为主,而不是每次运行都是从home页面开始 一 获取单个元素 get_element():在当前页面查询控件, 如果匹配到多个结果, 则返回第一个匹配到的结果 ...

  9. Ubuntu18.0 解决python虚拟环境中不同用户下或者python多版本环境中指定虚拟环境的使用问题

    一. 不同用户下配置virtualenvwrapper的问题 问题描述: 安装virtualnev和virtualnevwrapper之后,在.bashrc进行virtualenvwrapper的相关 ...

  10. idou老师教你学Istio 09: 如何用Istio实现K8S Ingress流量管理

    前言 在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置Istio Ingress Gateway 什么是Ingress Gateway 由于Kubernetes  Ingr ...