题目 1453: [蓝桥杯][历届试题]翻硬币 题解

本文介绍了一种解决翻硬币游戏问题的独特算法。通过贪心策略,文章详细阐述了如何计算从初始状态转变到目标状态所需的最小操作次数。利用动态规划的方法,定义了两种状态转移方程来实现这一计算。

这里写一种与其他题解不一样的方法,简单易懂。
题目:
题目描述
小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:oo*oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出
一个整数,表示最小操作步数。
样例输入
ooo***
ooo***
样例输出
1

首先明确一件事:
贪心思想,每个位置要么变一次,要么不变。
设f[i][0]表示前i个变为相同所需最小次数,且[i,i+1]不翻转
f[i][1]表示前i个变为相同所需最小次数,且[i,i+1]翻转
当第i个位置不同时:
f[i][0]=f[i-1][1];因为第i个位置最终要相同,而[i,i+1]不变,那么[i-1,i]就要变
f[i][1]=f[i-1][0]+1; 第[i,i+1]变
当第i个位置相同时:
f[i][0]=f[i-1][0];
f[i][1]=f[i-1][1]+1;
最后f[n][0]就是答案。

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
char s1[1010],s2[1010];
int f[1010][2];
int main()
{
	scanf("%s",s1+1);
	scanf("%s",s2+1);
	int len=strlen(s1+1);
	for(int i=1;i<=len;i++)
	{
		if(s1[i]!=s2[i])
		{
			f[i][0]=f[i-1][1];
			f[i][1]=f[i-1][0]+1;
		}
		else 
		{
			f[i][0]=f[i-1][0];
			f[i][1]=f[i-1][1]+1;
		}
	}
	printf("%d",f[len][0]);
	return 0;
 } 
内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值