day6 递推

news2024/11/23 21:56:04

P1928 外星密码

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

#include <bits/stdc++.h>
using namespace std;
 
string fun(){
	char ch;//输入字符 
	int n;//复制次数 
	string ans="", str="";//str:被复制的字符串
	while(cin>>ch){
		if(ch=='['){//遇到右括号,寻找被压缩的密码 
			cin>>n;
			str = fun();//递归调用,找到最内层被压缩的密码 
			while(n--){
				ans += str;//复制n次 
			}
			//return ans; 这里return 在本地就不需要加ctrl+Z
			// 但提交后一部分会报错(可能有些情况没想到) 
		}else if(ch==']'){
			return ans;//递归出口(一个足矣) 
		}else ans += ch;
	} 
}
int main()
{
	cout<<fun();
	return 0;
}
 

P1464 Function

因为数据可能很大,单纯递归超时(TLE),所以要用 记忆化搜索。我理解的 记忆化 就是,用数组将搜索过程中遇到的每种状态下的答案记在数组中,下次遇到即可直接输出,不必重复搜索。

这道题用 f[a][b][c] :表示 (a,b,c) 状态下的 ans 

百度“记忆化搜索”

记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。

一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。

更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。

记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,

以后再次遇到这个状态的时候,就不必重新求解了。

这种方法综合了搜索和动态规划两方面的优点

 

注意:例如 w(30,−1,0) 又满足条件 1 又满足条件 2,请按照最上面的条件来算.即判断顺序与题目保持一致即可。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll f[25][25][25];
bool vis[25][25][25];
// 把每次0~20以内的答案记录下来,
ll w(ll a,ll b,ll c){
	if(a<=0 || b<=0 || c<=0) return 1;
	else if(a>20 || b>20 ||c >20) return w(20,20,20);
	if(vis[a][b][c]) return f[a][b][c]; 
	else if(a<b && b<c) f[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
	else f[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
	vis[a][b][c] = true;
	return f[a][b][c];
}
int main()
{
	ll a, b, c;
	while(cin>>a>>b>>c){
		memset(vis,false,sizeof(vis));
		//注意:此处不能用连等 
		if(a==-1 && b==-1 && c==-1) break;
		cout<<"w("<<a<<", "<<b<<", "<<c<<") = ";//逗号后和等号前后的空格好坑,建议直接复制题解的进行修改 
		cout<<w(a, b, c)<<endl; 
	}
	return 0; 
}

其他题解:记忆宏(第一次听,所以记下来了)

在我们编写递归函数的时候,经常要用到记忆化搜索。我们可以使用一个宏定义来替换记忆化处理。这样记忆化处理就不会侵染我们的逻辑代码。类似于代理函数的思想。

值得注意的是,宏只需要在递归里替换即可,外部调用不用替换,主要是避免数组下标越界。

#include<bits/stdc++.h>
using namespace std;
// w_men[x][y][z]是否计算过,有直接返回,无计算并"记忆"
#define W_MEM(x,y,z)(w_mem[x][y][z]?w_mem[x][y][z]:w_mem[x][y][z]=w(x,y,z))//记忆宏
int a, b, c ;
int w_mem[25][25][25];
int w(int a, int b, int c) {
	if (a <= 0 || b <= 0 || c <= 0)return 1;
	if (a > 20 || b > 20 || c > 20)return W_MEM(20, 20, 20);
	if (a < b && b < c) return W_MEM(a, b, c - 1) + W_MEM(a, b - 1, c - 1) - W_MEM(a, b - 1, c);
	return W_MEM(a - 1, b, c) + W_MEM(a - 1, b - 1, c) + W_MEM(a - 1, b, c - 1) - W_MEM(a - 1, b - 1, c - 1);
}
int main() {
	while (1) {
		cin >> a >> b >> c;
		if (a == -1 && b == -1 && c == -1)break;
		cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a, b, c) << endl;
	}
}

P1002 [NOIP2002 普及组] 过河卒

A 点的坐标是(0,0)(0,0) ,并且,卒只能向下或向右。

可粗略得出状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1];

也可以是一维数组: dp[j] += dp[j-1] 

#include <bits/stdc++.h>
using namespace std;

int xb,yb,mx,my;
long long dp[25][25];
int vis[25][25];

int main()
{
	cin>>xb>>yb>>mx>>my;
	dp[1][1] = 1;
	xb++,yb++,mx++,my++;
	//标记马控制的数组 
	vis[mx][my] = 1;
	if(my-1>=0&&mx+2<=xb)vis[mx+2][my-1] = 1;
	if(my-2>=0&&mx+1<=xb)vis[mx+1][my-2] = 1;
	if(my-2>=0&&mx-1>=0) vis[mx-1][my-2] = 1;
	if(my-1>=0&&mx-2>=0) vis[mx-2][my-1] = 1;
	if(my+1<=yb&&mx-2>=0)vis[mx-2][my+1] = 1;
	if(my+2<=yb&&mx-1>=0)vis[mx-1][my+2] = 1;
	if(my+2<=yb&&mx+1<=xb)vis[mx+1][my+2] = 1;
	if(my+1<=yb&&mx+2<=xb)vis[mx+2][my+1] = 1; 
	for(int i=1;i<=xb;i++)
		for(int j=1;j<=yb;j++)//0行0列初始化为0,防止dp[i-1][j]或dp[i][j-1]越界出错 
			if(!vis[i][j]&&(i!=1||j!=1))
				dp[i][j] = dp[i-1][j] + dp[i][j-1];
				//这里也可压缩为一维数组dp[j]+=dp[j-1]; 
 
	cout<<dp[xb][yb]<<endl;
	return 0;
}

P1044 [NOIP2003 普及组] 栈

#include <bits/stdc++.h>
using namespace std;

int n,f[20];
int main()
{
	cin>>n;
    f[0] = 1, f[1] = 1;
	//由f[2] = 2;-->f[0]=1
	for(int i=2;i<=n;i++)//i个数 
		for(int j=0;j<i;j++)//比f[i]小的数f[j] 
			f[i] += f[j]*f[i-j-1];
	cout<<f[n]<<endl;
	return 0;
}

P1028 [NOIP2001 普及组] 数的计算

#include <bits/stdc++.h>
using namespace std;

int n, f[1005];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){//i个数合法数列总数 
	    for(int j=1;j<=i>>1;j++)//保证选择的数<=最后一个的一半 
	        f[i] += f[j];
	    f[i] ++;
	}
	cout<<f[n]<<endl;
	return 0;
}

 

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

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

相关文章

Teststand-控件

文章目录管理控件应用程序管理控件序列文件视图管理控件执行视图管理控件可视化控件视图连接列表连接命令连接信息源连接在 LabVIEW 中&#xff0c;TestStand 相关的所有控件都在estStand 选板上这些控件全部是Active X控件&#xff0c;LabVIEW对它的编程是属性节点、方法节点及…

ActivityManagerService,给我启动个App瞅瞅呗

前言 其实早在几年前&#xff0c;我就有一个疑问。 为什么我们的逻辑代码写在Activity中&#xff0c;在App启动后就会执行到它。为什么第三方库的初始化要写在Application中&#xff0c;而它为什么执行顺序比Activity还要靠前。 如果您想搞清楚这些原因&#xff0c;那么本文…

3年经验去面试20k测试岗,看到这样的面试题我还是心虚了....

我是着急忙慌的准备简历——3年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;3年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;自信满满去面试&#…

Python 数据分析之 3 —— pandas 数据分析

第1关:了解数据集特征 任务描述 本关任务:载入网贷数据集,了解数据概况。 共包含多个子任务: 1.1 读取Training_Master.csv文件,命名为master; 1.2 读取Training_Userupdate.csv文件,命名为user; 1.3 读取Training_LogInfo.csv文件,命名为log; 1.4 分别输出它们的形…

世界杯基本知识科普

目录 一、历史沿革 二、历届冠军 三、举办城市 四、中国情况 五、国际赛事统计 世界杯&#xff08;World Cup&#xff09;是由国际足联主办的世界足坛最高级别的足球比赛&#xff0c;每四年举办一次。 足球世界杯是由一项世界性的赛事&#xff0c;它由16个国家和地区联合…

cubeIDE开发, STM32的CAN总线开发要点

一、CAN总线简介 1.1 CAN概述 CAN是Controller Area Network&#xff08;控制区域网络&#xff09; 的缩写&#xff0c;是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后&#xff0c;CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络…

为什么数字化时代需要 BizDevOps?

随着云原生、元宇宙、Web3等技术拉开序幕&#xff0c;智能制造、智慧城市、精准医疗等应用场景徐徐展开&#xff0c;继人类工业文明之后&#xff0c;下一个大变局的奇点临近。 毫无疑问&#xff0c;以数字技术应用为主线的数字化转型是此次人类文明变革的核心动力。在这一变革…

JavaWeb蛋糕商城系统课程设计(Vue+ElementUI+Mybatis+HTML+Axios)

前提 唉&#xff0c;本学期疫情放假放得早&#xff0c;用了一个星期完成这次课设。(主要还是从0开始学前端的VUE),在HTML中引入VUE,然后用Axios&#xff08;封装AJAX&#xff09;发请求更新数据。感觉上特别繁琐&#xff0c; 蛋糕商城系统&#xff0c;也就是黑马程序员的Java…

从游戏服务端角度分析移动同步(状态同步)

从游戏服务端角度分析移动同步&#xff08;状态同步&#xff09; 参考文章&#xff1a; https://www.lfzxb.top/ow-gdc-gameplay-architecture-and-netcode/ https://zhuanlan.zhihu.com/p/544473862 对于游戏服务端来说&#xff0c;针对状态同步主要需要考虑的是三大模块&…

清远市城市品牌及五大百亿农业产业区域公用品牌亮相

12月19日&#xff0c;由清远市人民政府主办&#xff0c;中共清远市委宣传部、清远市农业农村局联合承办的“天赋风土 自在清远——清远城市品牌及五大百亿农业产业区域公用品牌发布会”正式举行&#xff0c;清远城市品牌与五大百亿农业产业区域公用品牌偕同亮相。清远向外界展示…

【SpringCloud学习笔记】Hystrix

Hystrix搭建项目服务降级服务熔断请求合并如何和Feign一起使用搭建项目 –|eureka-registry --注册中心 –|hystrix-service – 调用用户服务 –|user-service --用户服务 hystrix-service server:port: 9002 spring:application:name: hystrix-serviceeureka:instance:hostn…

jsp+ssm计算机毕业设计多功能电子词典【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

机器人开发--接近开关

机器人开发--接近开关1 概述1.1 定义1.2 分类2 各类介绍2.1 无源接近开关2.2 涡流式接近开关2.3 电容式接近开关2.4 霍尔接近开关2.5 光电式接近开关2.5.1 漫反射式光电开关2.5.2 镜反射式光电开关2.5.3 对射式光电开关2.6 其它型式参考1 概述 1.1 定义 接近开关是一种无需与…

ANTLR4入门(三):使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

在上篇博客《ANTLR4入门(二):图示说明eclipse安装Antlr4IDE插件的过程》&#xff0c;我费半天劲装好了Eclise的AntlrIDE插件&#xff0c;简单的创建一个ANTLR 4 工程&#xff0c;感受了一下AntlrIDE插件提供的语法高亮的便利性。及语法文件(.g4)自动生成解析器代码的过程 然而…

1557:祖孙询问——倍增求LCA

【题目描述】 已知一棵 n 个节点的有根树。有 m 个询问&#xff0c;每个询问给出了一对节点的编号 x 和 y&#xff0c;询问 x 与 y 的祖孙关系。 【输入】 输入第一行包括一个整数 n 表示节点个数&#xff1b; 接下来 n 行每行一对整数对 a 和 b 表示 a 和 b 之间有连边。如果…

Lattice Diamond关于原语的使用

Lattice Diamond关于原语的使用前言一、原语基本概念&#xff08;一&#xff09;简介&#xff08;二&#xff09;常用原语1.时钟相关原语2.差分输入/输出原语3.接口相关原语二、Lattice原语&#xff08;一&#xff09;原语使用&#xff08;二&#xff09;IP调用&#xff08;三&…

线性代数中的特征值和特征向量

一.几个基本概念 现将下文需要运用到的一些概念进行解释说明以便读者更好理解 1.特征值与特征向量 其中&#xff0c;我们要注意两点&#xff1a; &#xff08;1&#xff09;A是方阵&#xff08;对于非方阵&#xff0c;是没有特征值的&#xff0c;但会有条件数&#xff09; …

基于LMS算法的Mackey Glass时间序列预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 时间序列预测方法是科学、经济、工程等领域的研究重点之一。经典的时间序列预测方法在用于非线性系统预测时有一定的困难,而神…

论文投稿指南——中文核心期刊推荐(物理学2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精度】Subdivision-Based Mesh Convolution Networks

0.摘要 卷积神经网络( CNNs )在二维计算机视觉领域取得了巨大的突破。然而&#xff0c;其不规则的结构使得直接在网格上利用卷积神经网络的潜力变得困难。细分曲面提供了层次化的多分辨率结构&#xff0c;其中一个封闭的二维流形三角网格中的每个面恰好与三个面相邻。受这两点…