P1255 数楼梯

对于 100% 的数据,1≤N≤5000。

  • 高精度斐波那契
#include <iostream>
using namespace std;const int N = 5003;int len = 1;
int f[N][N];int main()
{int n; scanf("%d", &n);f[1][1] = 1; f[2][1] = 2;for (int i = 3; i <= n; i ++ ){for (int j = 1; j <= len; j ++ )f[i][j] = f[i - 1][j] + f[i - 2][j];for (int j = 1; j <= len; j ++ ){f[i][j + 1] += f[i][j] / 10;f[i][j] %= 10;if (f[i][len + 1]) len ++ ;}}for (int i = len; i; i -- ) printf("%d", f[n][i]);
}

P1002 [NOIP2002 普及组] 过河卒

对于100% 的数据,1≤n,m≤20,0≤ 马的坐标≤20。

  • 坐标原点从0开始,不方便,因此偏移加一
  • 又发现马涉及到的坐标即使偏移1还是可能越界,因此,偏移2
  • 关于马,只要让它的方案数为0即可,这样即使转移方程中涉及到了马,也只是加了0
#include <iostream>
using namespace std;const int N = 30;typedef long long ll;int dx[8] = {-2, -2, -1, 1, 2, 2, 1, -1};
int dy[8] = {-1, 1, 2, 2, 1, -1, -2, -2};ll f[N][N];
bool st[N][N];int main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int bx, by, mx, my; cin >> bx >> by >> mx >> my;bx += 2, by += 2, mx += 2, my += 2;st[mx][my] = true;for (int i = 0; i < 8; i ++ ){int x = mx + dx[i], y = my + dy[i];st[x][y] = true;}f[2][2] = 1;for (int i = 2; i <= bx; i ++ )for (int j = 2; j <= by; j ++ ){if (i == 2 && j == 2) continue;if (st[i][j]) continue;f[i][j] = f[i - 1][j] + f[i][j - 1];}cout << f[bx][by];
}

P1044 [NOIP2003 普及组] 栈

输入文件只含一个整数 n(1≤n≤18)。

  • 递归 / 记忆化搜索写法
    看数据dfs可能超时,因此想到记忆化搜索
    记忆化搜索,因此,定义一个二维数组f[i][j]表示队列里还有i个数,栈里还有j个数,f[i][j]表示此时的情况数,自然,在f[i][j]有值的情况下就返回
    递归的边界条件,队列中没有数了,就只剩这一种情况了,返回1
    如果栈空,不能弹出栈内元素,只能进栈一次;栈不空,此时可以出栈一次或者进栈一次
#include <iostream>
using namespace std;typedef long long ll;const int N = 20;ll f[N][N];ll dfs(int que, int stk)
{if (f[que][stk]) return f[que][stk];if (!que) return 1;if (stk) f[que][stk] += dfs(que, stk - 1);f[que][stk] += dfs(que - 1, stk + 1);return f[que][stk];
}int main()
{int n; scanf("%d", &n);printf("%lld", dfs(n, 0));
}

P1028 [NOIP2001 普及组] 数的计算

一个正整数 n(n≤1000)。

  • 打表方法 :
#include <iostream>
using namespace std;typedef long long ll;ll dfs(int u) {if (u == 1)ll tot = 1;for (int i = 1; i <= u / 2; ++ i) {tot += dfs(i);}return tot;
}int main() {cout << "a[1001]={";for (int i = 1; i <= 1001; ++ i) {cout << dfs(i) << ',';}cout << "}";
}
f[1] = 1
f[2] = f[1] + 1
f[3] = f[1] + 1
f[4] = f[1] + f[2] + 1
f[5] = f[1] + f[2] + 1
#include <iostream>
using namespace std;typedef long long ll;const int N = 1010;ll f[N];int main() {int n;cin >> n;f[1] = 1;for (int i = 1; i <= n; ++ i) {f[i] = 1;for (int j = 1; j <= i / 2; ++ j) {f[i] += f[j];}}cout << f[n];
}

P1464 Function

保证输入的数在[−9223372036854775808,9223372036854775807]之间,并且是整数。

  • 用记忆化搜索的时候要注意下标有没有可能为负数
  • 不要写成 return f[a][b][c] = dfs(a - 1, b, c) + ... 的形式,return最后再写
#include <iostream>
using namespace std;typedef long long ll;ll f[25][25][25];ll dfs(ll a, ll b, ll c) {if (a <= 0 || b <= 0 || c <= 0) return 1;if (f[a][b][c]) return f[a][b][c];ll t;if (a > 20 || b > 20 || c > 20) t = dfs(20, 20, 20);else if (a < b && b < c) t = dfs(a, b, c - 1) + dfs(a, b - 1, c - 1) - dfs(a, b - 1, c);else t = dfs(a - 1, b, c) + dfs(a - 1, b - 1, c) + dfs(a - 1, b, c - 1) - dfs(a - 1, b - 1, c - 1);f[a][b][c] = t;return f[a][b][c];
}int main() {ll a, b, c;while (scanf("%lld%lld%lld", &a, &b, &c) == 3) {if (a == -1 && b == -1 && c == -1) break;printf("w(%lld, %lld, %lld) = ", a, b, c);if (a > 21) a = 21;if (b > 21) b = 21;if (c > 21) c = 21;printf("%lld\n", dfs(a, b, c));}
}

P1928 外星密码

对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。
保证 有且仅有 数字字母和 [ 和 ]

  • 多重压缩,交给递归
  • 特殊:以下代码我在自己的编译器(Xcode)上是无法运行的,编译器显示函数中必须任何条件都有返回值,而这个代码本身不满足这个条件,由于题目数据保证必然有[和],实际运行没有问题
#include <iostream>
using namespace std;string dfs() {char ch;string res = "", s = "";while (cin >> ch) {if (ch == '[') {int k;cin >> k;s = dfs();while (k -- ) {res += s;}} else if (ch == ']') {return res;} else {res += ch;}}
}int main() {cout << dfs();
}

P2437 蜜蜂路线

对于100%的数据,M,N≤1000

  • 高精度
  • 答案是f[n - m + 1],因为从m走到n相当于从1走到n-m+1
#include <iostream>
using namespace std;const int N = 1010;int f[N][N];
int len = 1;int main() {int m, n;cin >> m >> n;f[1][1] = 1;f[2][1] = 1;for (int i = 3; i <= n - m + 1; ++ i) {for (int j = 1; j <= len; ++ j) {f[i][j] = f[i - 1][j] + f[i - 2][j];}for (int j = 1; j <= len; ++ j) {f[i][j + 1] += f[i][j] / 10;f[i][j] %= 10;}if (f[i][len + 1]) len ++ ;}for (int i = len; i; i -- )cout << f[n - m + 1][i];
}

P1164 小A点菜

正数aia_iai​可以有相同的数字,每个数字均在1000以内;保证答案的范围在int之内。

  • f[i][j]表示在考虑前i个物品的情况下,价格 恰好 是j的 方案数
  • 转移 :
    1.买当前这个,f[i][j] += f[i - 1][j - a[i]]
    2.不买当前这个,f[i][j] += f[i - 1][j]
    3.其实还有一种情况,就是如果买当前这个,且当前这个的价格恰好等于j,而f[i][0]没有被初始化就是0,实际上应该+1的,因此,我们初始化所有的f[i][0]为1
#include <iostream>
using namespace std;int f[110][10010];
int a[110];int main() {int n, m;cin >> n >> m;for (int i = 1; i <= n; ++ i)cin >> a[i];for (int i = 0; i <= n; ++ i) {f[i][0] = 1;}for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= m; ++ j) {if (j >= a[i]) f[i][j] += f[i - 1][j - a[i]];f[i][j] += f[i - 1][j];}}cout << f[n][m];
}
  • 由于每次f数组的第一维都只用到了i-1,因此可以给f数组降维,不要忘了第二重循环要倒着来
#include <iostream>
using namespace std;int f[10010];
int a[110];int main() {int n, m;cin >> n >> m;for (int i = 1; i <= n; ++ i)cin >> a[i];f[0] = 1;for (int i = 1; i <= n; ++ i) {for (int j = m; j >= a[i]; -- j)f[j] += f[j - a[i]];}cout << f[m];
}

P1036 [NOIP2002 普及组] 选数

第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)

  • 选择k个数中每个数所填的数
  • (100个数中选50个)去重 -> 不降原则(这道题不会选同一个数组,所以这里的 不降原则不能“平”)
#include <iostream>
#include <cmath>
using namespace std;bool is_prime(int x) {double t = sqrt(x);for (int i = 2; i <= t; ++ i) {if (x % i == 0)return false;}return true;
}int a[25];
int n, k, ans;void dfs(int sel, int sum, int st) {if (sel == k + 1) {if (is_prime(sum))ans ++ ;return ;}for (int i = st; i <= n; ++ i) {dfs(sel + 1, sum + a[i], i + 1);}return ;
}int main() {cin >> n >> k;for (int i = 1; i <= n; ++ i)cin >> a[i];dfs(1, 0, 1);cout << ans;
}

P1990 覆盖墙壁

一个整数N(1<=N<=1000000),表示墙壁的长。

  • 取后四位,也就是说%1e4
#include <iostream>
using namespace std;const int N = 1e6 + 10;
const int mod = 1e4;int f[N], g[N];int main() {int n;cin >> n;f[0] = 1; f[1] = 1;g[0] = 0; g[1] = 1;for (int i = 2; i <= n; ++ i) {f[i] = ((f[i - 1] + f[i - 2]) % mod + 2 * g[i - 2] % mod) % mod;g[i] = f[i - 1] + g[i - 1] % mod;}cout << f[n];
}

P3612 [USACO17JAN]Secret Cow Code S

该字符串包含最多30个大写字母,并 N≤1018\leq10^{18}≤1018

洛谷【算法1-4】递推与递归相关推荐

  1. 算法总结之递推与递归

    递推算法 递归算法大致包括两方面的内容:1)递归起点 : 2)递归关系 递推起点 递归起点一般由题目或者实际情况确定,不由递归关系推出.如果无法确定递归起点,那么递归算法就无法实现.可见,递归起点是递 ...

  2. 算法设计分析之------ 递推与递归篇二

    递推与递归篇二 递归 Secret Cow Code S 黑白棋子的移动 递推(动态规划) 覆盖墙壁 递归 Secret Cow Code S 题目链接:Secret Cow Code S 解题思路 ...

  3. [洛谷]P1936 水晶灯火灵 (#递推 -1.3)

    题目描述 爱与愁大神兴高采烈地踏出妖精系道馆--他已经获得了妖精系徽章(鼓掌)!可是一出门就遇到一群パンプジン(Because today is Halloween)!仲谋半?没事,爱与愁大神手上还仅 ...

  4. 0x02.基本算法 — 递推与递归

    目录 一.递推与递归 二.分治 三.模拟计算机实现递归 四.相应习题: 0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算) 1.AcWing 93. 递归实现组合型枚举 2.AcWin ...

  5. 算法的时间复杂度 递推

    算法的时间复杂度  递推 1. NOIP 2013 提高组 初赛 7.斐波那契数列的定义如下:F1 = 1, F2 = 1, Fn =Fn–1 + Fn–2 (n ≥ 3).如果用下面的函数计算斐波那 ...

  6. 算法竞赛宝典-递推算法

    算法竞赛宝典-递推算法 Problem A [递推]挖地雷 待更新 问题 B: [递推]偶数3的个数 时间限制: 1 Sec 内存限制: 64 MB 题目描述 "报告,我军已探出地雷阵中所有 ...

  7. 算法设计与分析 1 递推与递归

    递推与递归 Fibonacci #include<stdio.h> #pragma warning (disabled:4996) #define MAX 100 int f[MAX];/ ...

  8. 基本算法之递推与递归的简单应用

    递推与递归的简单应用 常见的枚举形式 实现指数型枚举 DFS (一) DFS (二) 位运算(一) 位运算(二) 实现组合型枚举 DFS + 剪枝 实现排列型枚举 DFS 费解的开关 奇怪的汉诺塔 分 ...

  9. 递推与递归 (区别)

    递推与递归 本文中部分内容转自他人博客,作者相关信息以及博客地址在文末. 概念 递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归. 递归的定义:在一个函数 ...

最新文章

  1. 一篇文章带你详解 TCP/IP 协议(下)
  2. 成功解决Python中出现的TypeError: object of type 'zip' has no len()
  3. stm8s开发(六) EXIT的使用:做一个外部中断的按钮!
  4. java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题
  5. 漫谈度量学习(Distance Metric Learning)那些事儿
  6. NDVI等植被相关指数
  7. 使用JdbcTemplate报 Incorrect column count: expected 1, actual 5错误解决
  8. 深蓝词库转换1.6发布
  9. 理解GAN生成对抗网络
  10. jmp怎么做合并的箱线图_Python数据可视化:箱线图多种库画法
  11. matlab算法之二分法
  12. 2019年美赛建模总结与e题思路
  13. windows ip管理之netsetman
  14. 2021年百度智能云服务器最新租用价格表
  15. 利用kali Linux进行中间人攻击
  16. 逻辑回归分类——信用卡诈骗检测!这才是干货!
  17. 检查Telerik UI以使用UWP作为PVS-Studio的入门方法
  18. 【Kong】网关-rate-limiting限流
  19. xbox修改密码服务器,Xbox One国行主机解锁切换美服/港服操作 附恢复国服教程
  20. sqlserver中的常见函数用法

热门文章

  1. SAP 调用外部系统
  2. 维护工厂的装运点确认
  3. Power Query
  4. SAP TABLECONTROL 搜索帮助相关设置
  5. ALV中动态内表+行转化为列
  6. IDOC实例, Inbound IDOC
  7. 社区O2O全面遇冷,社区金融如何避免走入独特陷阱
  8. php检测类是否存在,php判断类是否存在函数class_exists用法分析
  9. html弄多个按钮_html+css3实现多个表单按钮美化效果
  10. vue怎么截取时间年月_Vue + Element 获取标准时间、时间戳进行转换与操作(年月日)...