洛谷题单_递推与递归

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//不满分做法:没有高精度
#include <bits/stdc++.h>
using namespace std;
const int N=5006;
int dp[N];//dp[i]表示到第i节楼梯有dp[i]中方案
int main(){int n;cin>>n;dp[1]=1;dp[0]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];
//到第i节楼梯的方案数等于到第i-1节楼梯的方案数+第i-2节楼梯的方案数
//第i节楼梯 可与从第i-1节楼梯或者第i-2节楼梯转移过来}cout<<dp[n];return 0;
}

P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

//40分做法 暴力搜索
#include<bits/stdc++.h>
using namespace std;
long long n,m,cx,cy;
int fx[]={2,-2,1,-1,2,-2,1,-1};
int fy[]={1,-1,-2,2,-1,1,2,-2};//马的控制点
int mp[30][30];
int xx[]={1,0};//往下和往右
int yy[]={0,1};
int ans=0;//方案数
void dfs(int x,int y){if(x==n&&y==m){ans++;return ;}for(int i=0;i<2;i++){if(x+xx[i]>n||y+yy[i]>m)continue;//不越界if(mp[x+xx[i]][y+yy[i]]!=-1)dfs(x+xx[i],y+yy[i]);}return ;
}
int main(){cin>>n>>m>>cx>>cy;//输入地图的大小和马的坐标mp[cx][cy]=-1;//马的位置不能走for(int i=0;i<8;i++)mp[cx+fx[i]][cy+fy[i]]=-1;//马的控制点不能走dfs(0,0);//从(0,0)开始搜cout<<ans;return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
const int dir[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};//八个方向控制点
bool d[30][30];//地图的大小
long long dp[30][30],n,m,cx,cy;//dp[i][j]表示到达(i,j)的方案数
int main(){cin>>n>>m>>cx>>cy;d[cx][cy]=true;//马的位置设为true 不能走for(int i=0;i<8;i++){int tx=cx+dir[i][0],ty=cy+dir[i][1];if(tx>=0&&tx<=n&&ty>=0&&ty<=m) d[tx][ty]=true;//控制点的位置合法且不越界 设为true}dp[0][0]=1;//到达(0,0)只有一种方法for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){if(d[i][j]==false){//如果不是马的控制点说明能走if(i) dp[i][j]+=dp[i-1][j];//dp[i-1][j]不出界if(j) dp[i][j]+=dp[i][j-1];//dp[i][j-1]不出界//假设马的位置在两个地图的边界 那他的控制点就有可能出界这是不合法的}}}cout<<dp[n][m]<<'\n';return 0;
}

 P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1028 [NOIP2001 普及组] 数的计算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//暴力枚举 超时递归
#include<cstdio>
using namespace std;
int n,cnt=1;
void func(int x){for(int i=1;i<=x/2;i++){cnt++;func(i);}
}
//6 (1)
//6 1(2)
//6 2 (3)
//6 2 1(4)
//6 3(5)
//6 3 1(6)int main(){scanf("%d",&n);func(n);printf("%d\n",cnt);
}
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
int sum=1;
int f[N];//dp[i]表示以数字i或小于等于i为结尾的数的方案数
int main(){int n;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i/2;j++){f[i]+=f[j];}f[i]++;//自身算一种}cout<<f[n];return 0;
}

P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

P1464 Function - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

#include <cstdio>
#define LL long long
LL dp[25][25][25];
LL w(LL a, LL b, LL c){if(a <= 0 || b <= 0 || c <= 0) return 1;//两个特判,题意里都有的。if(a > 20 || b > 20 || c > 20) return w(20, 20, 20);if(a <b && b < c)//情况一,每一个没有储存过的“w”值全部储存,如果有就直接调用。{if(dp[a][b][c-1] == 0){dp[a][b][c-1] = w(a, b, c-1);}if(dp[a][b-1][c-1] == 0){dp[a][b-1][c-1] = w(a, b-1 ,c-1);}if(dp[a][b-1][c] == 0){dp[a][b-1][c] = w(a, b-1, c);}dp[a][b][c] = dp[a][b][c-1] + dp[a][b-1][c-1] - dp[a][b-1][c];}else//同上{if(dp[a-1][b][c] == 0){dp[a-1][b][c] = w(a-1, b, c);}if(dp[a-1][b-1][c] == 0){dp[a-1][b-1][c] = w(a-1, b-1 ,c);}if(dp[a-1][b][c-1] == 0){dp[a-1][b][c-1] = w(a-1, b, c-1);}if(dp[a-1][b-1][c-1] == 0){dp[a-1][b-1][c-1] = w(a-1, b-1, c-1);}dp[a][b][c] = dp[a-1][b][c] + dp[a-1][b][c-1] + dp[a-1][b-1][c] - dp[a-1][b-1][c-1];}return dp[a][b][c];
}int main()
{LL a, b, c;while(scanf("%lld%lld%lld", &a, &b, &c))//无限输入,直到“-1 -1 -1”{if(a == -1 && b == -1 && c == -1) return 0;//-1 -1 -1就直接结束,不运算了。printf("w(%lld, %lld, %lld) = ", a, b, c);printf("%lld\n", w(a, b, c));}
}

P2437 蜜蜂路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

 

//没有高精度
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int ans=0;
const int N=1e5+6;
int dp[N];//dp[i表示走到第i个格子的方案数
signed main(){cin>>n>>m;dp[n]=1;dp[n+1]=1;for(int i=n+2;i<=m;i++){dp[i]=dp[i-1]+dp[i-2];}cout<<dp[m];return 0;
}

P1164 小A点菜 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
int cnt=0;
int n,m;
int a[N];
int dp[N];//dp[i]表示在只选择前面几种商品的条件下花费为i的方案数
int main(){cin>>n>>m;for(int i=1;i<=n;++i){cin>>a[i];}dp[0]=1;for(int i=1;i<=n;i++){for(int j=m;j>=a[i];j--){dp[j]=dp[j-a[i]]+dp[j];//选和不选两种情况转移过来}}cout<<dp[m];return 0;
}

P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
using namespace std;
int n,k;
const int N=26;
int a[N],vis[N]={0};
int ans=0;
typedef long long ll;
bool isprime(int x){for(int i=2;i*i<=x;i++){if(x%i==0)return 0;}return 1;
}
void dfs(int m, int sum, int startx){//最重要的递归
//m代表现在选择了多少个数
//sum表示当前的和
//startx表示升序排列,以免算重
// 比如数有 123 没有startx可以选出12 21 而有的话不会再往前面找了if(m == k){//如果选完了的话if(isprime(sum))ans++;//ans加一return ;}for(int i = startx; i < n; i++)//往后找dfs(m + 1, sum + a[i], i + 1);//递归//步数要加一,和也要加//升序起始值要变成i+1,以免算重return ;//这一个步骤下,所有的都枚举完了//直接返回去
}
int main(){scanf("%d%d",&n,&k);//输入for(int i = 0; i < n; i++)scanf("%d",&a[i]);//循环读入dfs(0,0,0);//调用函数printf("%d\n",ans);//输出答案return 0;//结束程序
}
//另一种思路错的原因是因为可能出现 1 2 1 1 3 6 7这样的情况

 P1990 覆盖墙壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题其实就是一道递推题目,但它的递推公式又很复杂。

不得不说,前面两位DALAO的解法都是对的,但他们没有讲到他们写的状态转移方程是怎么来的,所以这应该会让很多蒟蒻(包括笔者本人)一脸懵逼~~~。所以本人打算详细地讲一讲这一题。

下面开始进入题解:


首先,既然是递推,那么分好状态就是一件非常重要的事情。这里本人直接讲状态。

(下文中的F[N]表示铺满前N*2的面积的墙的方案数;“一列”指长为1,宽为2的墙壁)


1.当这面墙的最后一列被铺满时(如下图所示)

以这种状态结尾的方案数为F[N-1]。


2.当这面墙的最后两列被铺满时(如下图所示,注意颜色的区别)

以这种状态结尾的方案数为F[N-2]。


大家也看到,前两种状态很容易想到,也很容易描述。

但是,L形的瓷砖又怎么办呢?

(呵呵,刚开始想到这里的时候,我自己都蒙了。)

为了方便大家思考,我们先往简单的方向想。(以下是重点!!!


我们可以用一个数组G[N]来表示**铺满前(N+1)*2的面积的墙,但是第(N+1)列有一个瓷砖已经被铺过(注意,是已经被铺过!)**的方案数。

所以,L形瓷砖的问题就已经被“初步”解决了。

所以,下面这种情况的方案数就是G[N-2](因为实际上第N列已经铺满了,所以这里要处理的是前N-1列墙,所以多减了1)(如下图所示):

同理,这一种情况的方案数也是G[N-2]:


OK,现在问题来了:这个G数组应该怎么维护呢?

不急,我们可以画图。

首先,第一种情况就是直接先让它变成一个长方形:

以这种状态结尾的方案数为F[N-3]。

第二种情况是,加上一块砖后,它仍然不是一个长方形:

so,这第二种情况的方案数就是G[N-3](可能需要转一下弯,希望大家能弄懂)。

所以,G[N-2](注意,不是G[N])的方案数就等于F[N-3]+G[N-3]。

稍微化简一下,就可以得出:G[N]=F[N-1]+G[N-1]。


所以,F[N]的转移方程就是:

F[N]=F[N-1]+F[N-2]+2*G[N-2](别忘了前面讲过G[N-2]的情况有两种

而G[N]的转移方程就是:G[N]=F[N-1]+G[N-1]。

初始化:F[0]=1,G[0]=0;F[1]=G[1]=1;

 

#include<iostream>
using namespace std;const int maxn=1000002;
const int mod=10000;int f[maxn],g[maxn];
//f[i]表示正常铺满的情况下 到第i排时的方案数
//g[i]表示前i排全部铺满 第i+1排只铺一块的方案数
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;f[0]=1;	//g[0]=0f[1]=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]=(g[i-1]+f[i-1])%mod;}cout<<f[n];return 0;
}
//首先f[i]可以从f[i-1]和f[i-2]转移过来
//也可从g[i-2]转移过来 就是铺上一个L形的
//g[i-2]=f[n-3]+g[n-3]

 P3612 [USACO17JAN] Secret Cow Code S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//暴力写法
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {string str;cin >> str;int n;cin >> n;// 循环直到字符串长度大于等于n+1while (str.length() <= n+1) {// 将字符串str的最后一个字符接在字符串开头char temp = str[str.length() - 1];str += temp + str;}// 输出第n个字符cout << str[n] <<'\n';return 0;
}
//strlen用于char s[]
//str.length()用于string s

P1259 黑白棋子的移动 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

P1010 [NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1228 地毯填补问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1498 南蛮图腾 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL(基础篇)——多表查询

一.多表关系 一对多(多对一) 多对多一对一 1.一对多(多对一) a.案例&#xff1a;部门与员工的关系 b.关系&#xff1a;一个部门对应多个员工&#xff0c;一个员工对应一个部门 c.实现&#xff1a;在多的一方建立外键&#xff0c;指向一的一方的主键 2.多对多 a.案…

Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client

Elasticsearch入门-环境安装ES和Kibana 安装 ES Windows安装ESHead安装浏览器插件 es-clientKibana 安装 安装es,安装header 安装kibana&#xff0c;安装多种分词器ik… 安装 ES Windows安装 ① 下载压缩包并解压官网链接&#xff1a;https://www.elastic.co/cn/downloads/ela…

canvas坐标系统 webgl坐标系统 uv纹理坐标系统 原点

一、canvas原点在左上角&#xff0c;x轴正方向向右&#xff0c;y轴正方向向下&#xff0c;一个点对应一个像素 二、webgl原点在正中间&#xff0c;x轴正方向向右&#xff0c;y轴正方向向上&#xff0c;数据显示范围在[-1,1]之间&#xff0c;超过此范围不显示数据 三、uv原点在左…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接&#xff1a;如何用ChatGPTGEEENVIPython进行高光谱&#xff0c;多光谱成像遥感数据处理&#xff1f; 第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

工厂模式:没你想像的那么难

工厂模式 工厂模式是一种创建型设计模式&#xff0c;它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成&#xff0c;从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性&#xff0c;减少了代码中的重复和耦合。 在工厂…

2021年下半年教师资格证考试《高中信息技术》题

4.使用某转码软件对一段时长为2分钟的AVI视频进行转码&#xff0c;转码后的视频信息如图4所示&#xff0c;计算存储该视频文件所需的空间大小为&#xff08;C &#xff09;。 A18MB B36MB C60MB D512MB 6.某21位二进制代码100101011010011110101&#xff0c;已知该代码由3个…

html基础操练和进阶修炼宝典

文章目录 1.超链接标签2.跳锚点3.图片标签4.表格5.表格的方向属性6.子窗口7.音视频标签8.表单9.文件上传10.input属性 html修炼必经之路—各种类型标签详解加展示&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 1.超链接标签 <!DOCTYPE html> <html lang"en…

再议【每天进步一点点】

概述 之前听姜胡说&#xff0c;讲到了他自己日更博客的故事&#xff0c;也就是每天去更新一篇博客文章。 日更&#xff0c;其实是一件很可怕的事情。 先不说文章的深度如何&#xff0c;单单从时间的耗费上&#xff0c;文字的积累上&#xff0c;以及对事物的敏感度上&#xf…

vue实现自定义树形穿梭框功能

需求&#xff1a; 我们在开发过程中&#xff0c;会遇到需要将一个数据选择做成穿梭框&#xff0c;但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示&#xff0c;ElementUI自身无法在穿梭框中添加树形结构&#xff0c;网上搜到了大佬封装的插件但是对于右侧的无树形结…

【从Python基础到深度学习】9.Python 语法基础

一、常量与变量 常量:程序中使用的具体的数、字符。在运行过程中&#xff0c;值无法更改 变量:表示一一个存储单元&#xff0c;其中存储的值可以修改 如&#xff1a;a5,b6 变量命名: 1、只能包含字母、数字、下划线 2、只能以字母、下划线开头 3、不要使用关键字作为变量名称 …

不知道伦敦银模拟账户该如何使用?至少3个用法

由于模拟交易的特别属性&#xff0c;很多人对模拟交易并不用心&#xff0c;假的资金用心干什么&#xff1f;就算交易得再好&#xff0c;盈利得再多&#xff0c;假的资金会变成真的吗&#xff1f;因此当然不会这么用心对待伦敦银模拟账户交易账户。实际上&#xff0c;这种观点是…

List集合的Stream流式操作实现数据类型转换

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、Collectors.toList() 2、Collectors.toCollection(ArrayList::new) 3、Collectors.toCollection(LinkedList::new) 4、Collectors.toCollection(LinkedHashSet::new) 5、Collector…

MAC M1 安装mongodb7.0.5 版本

1、进入官网 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、选择版本 3、下载后解压 放到 /usr/local 并修改…

Facebook Messenger链接分享:如何创建链接并设置自动化内容

Facebook Messenger链接是指基于Facebook用户名创建的会话链接&#xff0c;用户可以在其Facebook页面的设置部分复制此链接进行分享。然后将该链接直接粘贴到独立站、电子邮件、名片或社交媒体中&#xff0c;让目标受众可以一键进入对话。为了满足某些商家的需求&#xff0c;Fa…

vue3中的ref和reactive的区别

vue3中的ref和reactive的区别 1、响应式数据2、ref3、reactive4、ref VS reactive5、往期回顾总结&#xff1a; 1、响应式数据 处理响应式数据时到底是该用ref还是reactive... 响应式数据是指在 Vue.js 中&#xff0c;当数据发生变化时&#xff0c;相关的视图会自动更新以反映…

【bash】2、手把手实现一个 bash shell:多个机器批量执行 shell 命令,支持 ip 补全

文章目录 一、需求&#xff1a;多台机器批量远程执行 shell 命令1.1 业务需求拆解为脚本需求1.2 帮助函数&#xff1a;使用说明文档1.3 main 函数框架 二、功能&#xff1a;单机 sshp 执行2.1 fullip 函数&#xff1a;实现 ip 补全2.1.1 参数说明2.1.2 定义全局变量2.1.3 实现&…

Pytorch 复习总结 4

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 深度学习计算。 本文先介绍了深度学习中自定义层和块的方法&#xff0c;然后介绍了一些…

基于Beego 1.12.3的简单website实现

参考 用Beego开发web应用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官网 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

微信开发者工具-代码管理和码云Github远程仓库集成

目录 思考&#xff1a;IDE如何进行代码管理 代码管理方式 一、自身提供服务 二、Git 扩展 1、环境准备 2、创建项目代码 3、进行项目Git初始化 4、在码云新建远程仓库 5、将项目进行远程仓库关联 三、SVN扩展 四、代码管理 思考&#xff1a;IDE如何进行代码管理 初识开…