uva 1414 - Hanoi Towers(dp)_JeraKrs的博客-程序员秘密

技术标签: UVA  动态规划-基础  训练指南-第一章  

题目连接:uva 1414 - Hanoi Towers


题目大意:给出n,表示说有n个碟子,有三根柱子,进行汉诺塔游戏,不过不同的是说,移动碟子必须按照给出的顺序,如果可以移动,则必须移动当前的碟子到指定位置(所谓不能移动是因为其他位置上的碟子比当前位置上的要小);并且不能连续移动同一个碟子两次。


解题思路:因为移动顺序被限制死了,所以移动的方案是固定的,而且除了最小的碟子以外,所有碟子都会被比自己小的碟子限制住,而且如果前一次不是移动最小的碟子,那么当前一定会移动最小的碟子。并且说最小的碟子移动到哪一个柱子,就会决定说下一个碟子必须移动到哪里,没有的选,也不需要考虑顺序。

所以我们只需要考虑最小碟子的移动的顺序即可

1)A -> B/C ->C/B ->A    x = 2,y=1

2)  A -> B/C -> A              x =3, y=2

3)  A ->B/C ->C/B ->B/C  x=3,y=0

然后dp[i] = dp[i-1]*x + y。


#include <stdio.h>
#include <string.h>

const int N = 50;
typedef long long ll;

int n;
ll x, y, dp[N];

inline void init () {
	int v[5];
	char s[5];
	memset(v, 0, sizeof(v));

	for (int i = 0; i < 6; i++) {
		scanf("%s", s);
		int u = s[0] - 'A' + 1;
		int k = s[1] - 'A' + 1;

		if (v[u]) continue;

		v[u] = k;
	}

	if (v[2] != 1 && v[3] != 1) {
		x = 3; y = 0;
	} else if (v[v[1]] == 1) {
		x = 3; y = 2;
	} else {
		x = 2; y = 1;
	}
}

int main () {
	while (scanf("%d", &n) == 1) {
		init ();
		dp[1] = 1;
		for (int i = 2; i <= n; i++)
			dp[i] = dp[i-1] * x + y;
		printf("%lld\n", dp[n]);
	}
	return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011328934/article/details/21454489

智能推荐

Spark 2.2.0 集群部署_我的微信公众号的博客-程序员秘密

环境说明服务器1主机名:node201IP:10.0.0.201OS: centos 7.4hadoop: NameNode, ResourceManager, SecondaryNameNode spark: master服务器2主机名:node202IP:10.0.0.202OS: centos 7.4hadoop: DataNode,

Mxnet/Gluon学习系列(二)—— mxnet中的延迟执行_mx.nd.waitall()_TurtleMeow的博客-程序员秘密

龟龟是最可爱的小猫咪Mxnet中的延迟执行import numpy as npimport timeimport mxnet.ndarray as ndprint("===============start using mxnet ndarray============")start = time.time()x = nd.random.uniform(shape = (200...

二,建立第一个项目,跟模拟器的使用_勥小透明的博客-程序员秘密

建立第一个项目:没啥好说的,就填个项目名选上需要的API,我就选了个2.2的api这里就是package name,这里要改改,填一个自己的,我这里瞎写的,然后完成就完活了运行项目和模拟器的配置:安卓模拟器名字叫AVD打开窗口-AVD Manager弹出一个窗口,右边有个new,点了name就是填个名字target还是选需要的api,这里接着选安

FZU 2253 DP(最大子段和变形)_斗片dp2253_Bahuia的博客-程序员秘密

题意:题目链接:http://acm.fzu.edu.cn/problem.php?pid=2253 给出一串01序列,现在要选择一个区间[L,R]翻转,求得反转之后的序列包含的1最多有多少个。思路:最大子段和的变形。 设dp[i]表示以位置i为反转终点最多有1的个数,那么一共只有两种可能,要么从之前的最大值转移过来,要么从i点开始翻转,并加上i-1之前的前缀和,因此可以得出方程: dp[i]

标准C++类std::string的内存共享和Copy-On-Write..._weixin_33965305的博客-程序员秘密

标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1、 概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复...

随便推点

React组件自定义属性的定义及使用_react定义一个输出属性值的方法和一个修改属性值的方法_zding92的博客-程序员秘密

React组件自定义属性的定义及使用在很多情况下,react组件中,需要使用自定义的属性。也经常需要在默认事件(如,点击onClick)中使用自定义属性。举一个很简单的例子,点击一个按钮,并显示这个按钮“自定义属性”中的string。import React, { Component } from 'react';export default MyButton extends Compo...

FPGA自学4—— Modelsim仿真软件使用_fpga仿真软件有哪些_仲南音的博客-程序员秘密

Modelsim是一款仿真软件,可对VHDL 和Verilog HDL两种语言进行混合仿真。 前仿真:功能仿真,不考虑门电路延时与线延时,主要是验证电路与理想情况是否一致。 后仿真:时序仿真(布线后仿真),电路在实际应用中的工作仿真,考虑门电路延时与线延时,能反映芯片的实际工作情况。1、关联Quartus II 和Modelsim 软件打开QuartusII 软件关联modlesim软件配置工程仿真软件...

stein算法(求最大公因数)_stein求最大公因数_unhurried_swordsman的博客-程序员秘密

简述Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对 大整数 进行运算时,需要 试商 导致增加运算时间的缺陷而提出的改进算法。试商:在被除数和除数比较大时,人工除法列式计算的过程显得异常繁杂。这时可以将被除数、除数“四舍五入”来简化计算,把得到的商作为依据来求得真正的商。特别在数字开平方、开立方时,经常会遇到这类情况。

C# 关于dgv中DataGridViewComboBoxCell触发事件_c# dgv 单元格改变事件_GIS_D的博客-程序员秘密

cell触发事件的先后顺序:①不进行cell编辑情况时:          CellEnter--&amp;gt;CellLeave--&amp;gt;CellValidating--&amp;gt;CellValidated②对cell进行编辑后:          CellEnter--&amp;gt;CellBeginEdit--&amp;gt;CellLeave--&amp;gt;CellValidating--&amp;gt;...

低功耗蓝牙模块智能门锁应用案例_成都亿佰特电子科技有限公司的博客-程序员秘密

要说我们接触最多的智能产品应该就是手机吧,随着科技的不断发展,各种各样的智能产品现在都前赴后继的出现在我们眼前了,其中智能家居的迭代也如雨后春笋一般。层出不穷的产品除了让用户感受到科技感以外也便捷了生活和管理。今天我们来说一说,和我们生活最息息相关的一个亿佰特的设计案例,低功耗蓝牙模块智能门锁应用案例需求是什么?智能门锁作为居家和社区必备产品,设计方案也是多到数不胜数。其中普遍的头号需求是什么呢?当然是低功耗。毕竟我们用智能门锁是为了方便生活,而不是想多一项换电池的工作。所以在众多的..

学计算机单招可以报那几个公立学校,单招可以填报几所学校?只能报本省的学校吗?..._林子诗的博客-程序员秘密

许多报名参加单独招生的同学,对能填写哪一些院校并不是很详细了解,也有人会把单独招生和春季高考混淆是非,认为是和高考一样,能考大学本科,那,今天就和小编一起来详细了解下吧!单招是什么意思?单独招生是高等职业院校单独考试单独招生,是由国家教育部单独对中等职业院校院校应届毕业生和普高学生的一类招收方法。报考报名参加招收录取的院校主要是一些独立设置的全日制教育通常高等职业院校和一些招收专科的本科大学。单独...

推荐文章

热门文章

相关标签