当前位置: 首页 > ds >正文

csp基础知识——递推

1.pell数列:起初是pell数列,产生了dp的解题思路。

假设ai是pell数列,那么有以下规律:

a1=1;a2=2;a3=2*a2+a1;...ai=2*a(i-1)+a(i-2)...

那么求ak=?

有两种解题思路:一种是递推,还有一种是迭代。递推的话,上面的公式已经很明显了,直接一个for循环搞定;迭代也是用for循环,不过循环内部的三个变量要相互变换。。。

int a = 1, b = 2, t;

for(int i = 3; i <= k; ++i)
{
t =  2*b+a;

          a = b;//更新a
b = t;//更新b

       }//最后输出b

2.后来是铺方块问题:在规定长度2*n的格子里,铺方块2*1 

题目描述:小X对着一个长为N宽为2的矩形棋盘发呆,突然想到棋盘上不仅可以放棋子,还可以放多米诺骨牌。每个骨牌都是一个长为2宽为1的矩形,当然可以任意旋转,一共有三个颜色的骨牌。小X想知道在骨牌两两不重叠的前提下,铺满有多少种排列方式。

基本思路就是先考虑排法,再考虑颜色。

dp[0] = 1
dp[1] = 1
dp[i] = dp[i-1] + dp[i-2] (放一个竖牌 或 放两个横牌)

对于每种铺法,计算骨牌个数,再计算上色

假设每块骨牌有 3 种颜色。

如果铺法用了 k 个骨牌,总上色方案数为:dp[n] × 3^k,用快速幂方法

快速幂?  

那么如何计算骨牌数k? 一种思路是 总格子数/单个骨牌所占格子数,即k=2*n/1*2=n 

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;const int MOD = 1e9 + 7;int main() {int n;cin >> n;// 预处理dpvector<long long> dp(n + 1, 0);dp[0] = 1;  // 空棋盘dp[1] = 1;  // 只能竖着放for (int i = 2; i <= n; ++i) {dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;}// 快速幂计算 3^n % MODlong long power3 = 1, base = 3;int k = n;  // 一共会放 n 块骨牌while (k > 0) {// 2^4=4^2=16^1if (k % 2 == 1) power3 = (power3 * base) % MOD;//指数是奇数,就拿出一个底数,乘到结果项里base = (base * base) % MOD;//现在指数k必然是偶数,底数base增倍,指数减下来k /= 2;}long long ans = (dp[n] * power3) % MOD;cout << ans << endl;return 0;
}

3.有一道题目,可以深入了解dp的含义:

#include <bits/stdc++.h>
using namespace std;// 高精度加法
string add(string a,string b){string c;reverse(a.begin(), a.end());reverse(b.begin(), b.end());int la = a.size(), lb = b.size();int n = max(la, lb);int y = 0; // 进位for (int i = 0; i < n; i++) {int x = y; // 当前位的总和初始为进位if (i < la) x += a[i] - '0';if (i < lb) x += b[i] - '0';c += (x % 10) + '0';y = x / 10;}if (y!=0) c += y + '0';reverse(c.begin(), c.end());return c;
}int main(){vector<string> dp(110);//从1到n的路径个数dp[0]="0";dp[1]="1";dp[2]="1";// 构造 dp[1] 到 dp[100]for(int i=3;i<=100;i++){dp[i] = add(dp[i-1], dp[i-2]);}int n, m;cin >> m >> n;// 从m~n路径数等价于从1~m-n+1的路径数,本质上都是一样的,从某一起始点开始//[m]-m+1=1//[n]-m+1=n-+1cout << dp[n - m + 1] << endl;
}

http://www.xdnf.cn/news/16140.html

相关文章:

  • OpenCV快速入门之CV宝典
  • axios统一封装规范管理
  • oracle查询数据结构滤涉及的sql语句
  • Oracle 12c 创建数据库初级教程
  • 消息队列学习
  • .net 警告【代码 CS1998】此异步方法缺少 “await“ 运算符,将以同步方式运行。
  • VRRP技术
  • 基于springboot的医院管理系统(源码+论文+开题报告)
  • AWS RDS 排查性能问题
  • 【AI总结】网线技术演进史:从语音电缆到40Gbps的蜕变之路
  • 7.22总结mstp,vrrp
  • Android perfetto 工具使用
  • 浅谈——游戏中的各种配置格式
  • Excel file format cannot be determined, you must specify an engine manually.
  • 【音视频协议篇】RTMP协议
  • 一、Vue概述以及快速入门
  • [IMX][UBoot] 16.Linux 内核移植
  • 智算中心光纤线缆如何实现自动化计算?
  • 初识卷积神经网络CNN
  • (12)机器学习小白入门YOLOv:YOLOv8-cls 模型微调实操
  • 为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?
  • 开发浏览器插件-保存页面元素数据为json或csv
  • 2.9学习DOM和BOM (主要是获取元素的操作)
  • 苍穹外卖DAY10
  • 如何用 LUKS 和 cryptsetup 为 Linux 配置加密
  • Flink框架:keyBy实现按键逻辑分区
  • Linux物理地址空间入门:从硬件到内核内存的基石
  • 网络设备功能对照表
  • Pytorch张量
  • 云原生技术与应用-Kubernetes Pod调度基础