递推法

线性DP

线性递推 和 非线性递推

系数是常数的是线性递推,比如Fibonacci数 f[i] = f[i-1] + f[i-2]

系数不是常数的不是线性递推,比如错排方案数

重要网站

http://oeis.org/

参考题目

P1096 [NOIP2007 普及组] Hanoi 双塔问题

https://www.luogu.com.cn/problem/P1096

题目描述

给定AABBCC三根足够长的细柱,在AA柱上放有2n2n个中间有孔的圆盘,共有nn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3的情形)。

现要将这些圆盘移到CC柱上,在移动过程中可放在BB柱上暂存。要求:

(1)每次只能移动一个圆盘;

(2)AABBCC三根细柱上的圆盘都要保持上小下大的顺序;

任务:设AnA_n2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nn,输出AnA_n

输入格式

一个正整数nn,表示在AA柱上放有2n2n个圆盘。

输出格式

一个正整数, 为完成上述任务所需的最少移动次数AnA_n

样例 #1

样例输入 #1
1
样例输出 #1
2

样例 #2

样例输入 #2
2
样例输出 #2
6

提示

【限制】

对于50%50\%的数据,1n251 \le n \le 25

对于100%100\%的数据,1n2001 \le n \le 200

【提示】

设法建立AnA_nAn1A_{n-1}的递推关系式。

参考代码

#include <bits/stdc++.h>
using namespace std;
stringstream ss;
string s;
int n;
int main() {
	cin >> n;
	ss << fixed << setprecision(0) << pow(2, n + 1);
	ss >> s; // s = ss.str();
	s[s.size() - 1] -= 2;
	cout << s << endl;
	return 0;
}

题解

输入nn,输出2(2n1)2(2^n - 1),可以利用精确输出double的特性。

  1. 递推法
    1. 线性DP
    2. 线性递推 和 非线性递推
    3. 重要网站
    4. 参考题目
      1. P1096 [NOIP2007 普及组] Hanoi 双塔问题