洛谷题单_递推与递归

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.hqwc.cn/news/504888.html

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

相关文章

Docker实战——网络通信

目录 一、Docker 容器网络通信的基本原理1、查看 Docker 容器网络&#xff08;1&#xff09;新建一个 Dockerfile文件&#xff0c;内容如下&#xff1a;&#xff08;2&#xff09;使用以下命令创建镜像&#xff08;3&#xff09;基于 debian 的镜像创建一个容器&#xff0c;并进…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

第三百七十八回

文章目录 1. 概念介绍2. 实现方法2.1 maskFilter2.2 shader 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"两种阴影效果"相关的内容&#xff0c;本章回中将介绍如何绘制阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

【C++庖丁解牛】类与对象

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.面向过程和面向对象…

构建大语言模型的四个主要阶段

大规模语言模型的发展历程虽然只有短短不到五年的时间&#xff0c;但是发展速度相当惊人&#xff0c;国内外有超过百种大模型相继发布。中国人民大学赵鑫教授团队在文献按照时间线给出 2019 年至 2023 年比较有影响力并且模型参数量超过 100 亿的大规模语言模型。大规模语言模型…

基于雷达影像的洪水监测技术方法详解

洪水发生时候大多数是阴雨天气&#xff0c;光学影像基本上拍不到有效影像。雷达影像这时候就能发挥其不受天气影像的优点。现在星载的雷达卫星非常多&#xff0c;如高分三号、陆探一号、海丝一号&#xff08;巢湖一号&#xff09;、哨兵1号等。本文以哨兵1号L1地距(GRD)产品来介…

【初中生讲机器学习】13. 决策树算法一万字详解!一篇带你看懂!

创建时间&#xff1a;2024-03-02 最后编辑时间&#xff1a;2024-03-02 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

Excel 按奇数偶数列处理数据

目录 一. 需求背景1.1 获取偶数列的数据1.2 奇偶列数据互换 二. 解决方式2.1 为列添加奇偶辅助列2.2 通过公式将奇偶列互换 一. 需求背景 1.1 获取偶数列的数据 ⏹ 最近在整理歌单&#xff0c;发现部分歌曲没有歌词&#xff0c;于是打算自己制作一份。 从网上找到了歌词&…

【Spring IoC】实验四:特殊值处理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Topaz Gigapixel AI:让每一张照片都焕发新生mac/win版

Topaz Gigapixel AI 是一款革命性的图像增强软件&#xff0c;它利用先进的人工智能技术&#xff0c;能够显著提升图像的分辨率和质量。无论是摄影爱好者还是专业摄影师&#xff0c;这款软件都能帮助他们将模糊的、低分辨率的照片转化为清晰、细腻的高分辨率图像。 Topaz Gigap…

《Spring Security 简易速速上手小册》第9章 测试与维护 (2024 最新版)

文章目录 9.1 编写安全测试9.1.1 基础知识9.1.2 重点案例&#xff1a;保护 REST API9.1.3 拓展案例 1&#xff1a;自定义登录逻辑测试9.1.4 拓展案例 2&#xff1a;CSRF 保护测试 9.2 Spring Security 升级和维护9.2.1 基础知识9.2.2 重点案例&#xff1a;适配新的密码存储格式…