【动态规划-状态机模型】:大盗阿福、股票买卖Ⅳ、股票买卖Ⅴ、设计密码【已更新完成】

题目类型
大盗阿福状态机模型
股票买卖Ⅳ状态机模型
股票买卖Ⅴ状态机模型
设计密码状态机模型

1、大盗阿福

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。

这条街上一共有 N 家店铺,每家店中都有一些现金。

阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。

作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。

他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入格式 
输入的第一行是一个整数 T ,表示一共有 T  组数据。
 
接下来的每组数据,第一行是一个整数 N  ,表示一共有 N  家店铺。
 
第二行是 N  个被空格分开的正整数,表示每一家店铺中的现金数量。

每家店铺中的现金数量均不超过1000。
 
输出格式 
对于每组数据,输出一行。
 
该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。
 
数据范围 
1≤T≤50 , 1≤N≤105

输入样例: 
2 
3 
1 8 2 
4 
10 7 6 14 
输出样例: 
8 
24 
样例解释 
对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。
对于第二组样例,阿福选择第14家店铺行窃,获得的现金数量为10+14=24

思路:

f[i][j]表示对于前i个店铺,j表示偷或者不偷,所产生的价值的集合,属性:最大值
每个店铺有两个状态:0和1分别表示不偷和偷,两个状态相互转换

两个状态:
第i个店铺被偷可以由第i-1个店铺不被偷转换过来
第i个店铺不被偷可以由第i-1个店铺偷或者不被偷转换过来

状态转移方程:

            f[i][0] = max(f[i - 1][1], f[i - 1][0]);
            f[i][1] = f[i - 1][0] + a[i];

代码:

#include<bits/stdc++.h>

using namespace std;

int t;

int n;

const int N=1e5+5,INF=0x3f3f3f3f;

int a[N];

int f[N][2];//f[i][j]中,i代表前i个金店的方案,j为1表示偷,j为0表示不偷

//转移方程:
//fi,1=fi−1,0+wi
//fi,0=max(fi−1,1,fi−1,0)

int main()
{
    cin>>t;

    while(t--)
    {
        cin>>n;

        for(int i=1;i<=n;i++)
        {
            cin>>a[i];//输入每家金店的现金数量
        }

        //dp
        f[0][0]=0;
        f[0][1]=0;

        for(int i=1;i<=n;i++)
        {
            f[i][0] = max(f[i - 1][1], f[i - 1][0]);
            f[i][1] = f[i - 1][0] + a[i];
        }

         cout << max(f[n][0], f[n][1]) << endl;
    }

    return 0;
}

2、股票买卖Ⅳ

给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。

输入格式 第一行包含整数 N  和 k ,表示数组的长度以及你可以完成的最大交易笔数。

第二行包含 N  个不超过 10000  的非负整数,表示完整的数组。

输出格式 输出一个整数,表示最大利润。

数据范围 
1≤N≤105 , 1≤k≤100 
输入样例13  2 
2 4 1 
输出样例12 
输入样例26 2 
3 2 6 5 0 3 
输出样例27 
样例解释 样例1:在第 1(股票价格 = 2) 的时候买入,在第 2(股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

样例2:在第 2(股票价格 = 2) 的时候买入,在第 3(股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2
= 4 。随后,在第 5(股票价格 = 0) 的时候买入,在第 6(股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。共计利润 4+3 = 7. 

思路:

f[i][j][k]表示前i天,交易次数为j,股票持有状态为k的方案的获得的价值(状态k == 0的时候,相当于完成了j笔交易,状态k == 1的时候,相当于正在进行第j笔交易)
属性:最大值
状态机表示:
空仓状态可以由持仓状态和空仓状态转移过来
持仓状态可以由持仓状态和空仓状态转移过来
注意卖出后才相当于一次交易

			//空仓状态
	        f[i][j][0]=max(f[i-1][j][1]+a[i],f[i-1][j][0]);
	        //持仓状态
	        f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-a[i]);//卖出才构成一次完整的股票交易,所以从j-1开始转移

对于持仓状态转移方程的解释:

 f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-a[i]);

可以从第j笔交易中的持仓状态转移过来,如果从持仓状态转移过来,可以直接在i-1天直接转移过来
如果从空仓转移过来,那需要买股票,意味着新的一笔交易开始了,j就相当于那一笔新的交易,那么上次空仓的状态(k == 0,如上文所述,状态k 0的时候,相当于完成了j笔交易,状态k == 1的时候,相当于正在进行第j笔交易)就相当于完成了j-1次交易,那就从j-1笔交易的状态转移过来

代码:

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+3;

int n,k;

int a[N];

int f[N][103][2];

int main()
{
	cin>>n>>k;
	
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}//读入股票在第i天的价格
	
	
	memset(f,-0x3f,sizeof f);
	
	for(int i=0;i<=n;i++)f[i][0][0]=0;//从0开始初始化
	
	//dp
	
	for(int i=1;i<=n;i++)
	{
	    for(int j=1;j<=k;j++)
	    {
	        //空仓状态
	        f[i][j][0]=max(f[i-1][j][1]+a[i],f[i-1][j][0]);
	        //持仓状态
	        f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-a[i]);//卖出才构成一次完整的股票交易,所以从j-1开始转移
	    }
	}
	int res=0;
	for(int i=1;i<=k;i++)res=max(res,f[n][i][0]);
	
	cout<<res;
	return 0;
}

3、股票买卖Ⅴ

给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

  输入格式
  第一行包含整数 N ,表示数组长度。
  
  第二行包含 N  个不超过 10000  的正整数,表示完整的数组。
  
  输出格式    
  输出一个整数,表示最大利润。
 
  数据范围 
  1≤N≤105 
  输入样例:
  5 
  1 2 3 0 2 
  输出样例: 
  3 
  样例解释 
  对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出],第一笔交易可得利润 2-1 = 1,第二笔交易可得利润 2-0 = 2,共得利润 1+2 = 3

思路:

这时候要用到三个状态了(前两题都是两个状态)

状态表示:
f[N][K]表示前i天的状态为k表示的价值的集合
属性:最大值
三个状态分别为:冷却期(不能买东西)、空仓期(空仓大于等于两天的情况,也是本题状态的入口,因为一开始也是可以直接买股票的)、持仓期

初始化:
把所有的状态都初始化为非法的(负无穷),只有一个合法状态那就是入口
用2表示空仓期、1表示冷却期、0表示持仓期

状态转移方程:

		//空仓一天的情况
		f[i][1]=f[i-1][0]+w[i];//上一支股票的持仓状态卖出  
		
		//空仓二天以及以上的情况 
		f[i][2]=max(f[i-1][2],f[i-1][1]);
		
		//持仓的情况 
		f[i][0]=max(f[i-1][0],f[i-1][2]-w[i]);

代码:

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+3;

int w[N];

int n,m;

int f[N][3];

int main()
{
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&w[i]);
	}
	
	//dp
	int res=0;
	memset(f,-0x3f,sizeof f);
	
	
	f[0][2]=0;
	
	for(int i=1;i<=n;i++)
	{
		
		//空仓一天的情况
		f[i][1]=f[i-1][0]+w[i];//上一支股票的持仓状态卖出  
		
		//空仓二天以及以上的情况 
		f[i][2]=max(f[i-1][2],f[i-1][1]);
		
		//持仓的情况 
		f[i][0]=max(f[i-1][0],f[i-1][2]-w[i]);
		
		//cout<<f[i][0]<<" "<<f[i][2]<<" "<<f[i][1]<<endl;
		
		//res=max(f[i][2],f[i][1]);
		
	}
	
	cout<<max(f[n][2],f[n][1]);

	//cout<<res;
	return 0;
}  

4、设计密码

你现在需要设计一个密码 S ,S 需要满足:

S 的长度是 N ; S 只包含小写英文字母; S 不包含子串 T ; 例如:abc 和 abcde 是 abcde
的子串,abd 不是 abcde 的子串。

请问共有多少种不同的密码满足要求?

由于答案会非常大,请输出答案模 109+7 的余数。

输入格式 
第一行输入整数N,表示密码的长度。

第二行输入字符串T,T中只包含小写字母。

输出格式 
输出一个正整数,表示总方案数模 109+7  后的结果。

数据范围 
1≤N≤50 , 1|T|≤N ,|T| 是T 的长度。

输入样例12 a 
输出样例1625 
输入样例24 cbc 
输出样例2456924

思路:

即密码串中不能包含给定的模式串
结合kmp算法可得,若模式串的长度为m,则对于每一位密码总共有26种允许的(但不一定存在的)匹配状态
分别为不和子串有任何匹配(0表示不匹配)、匹配到第一个位置、匹配到第二个位置…匹配到第m-1个位置(因为匹配到m就包含这个模式串了,所以说不能匹配到第m个位置)

f[i][j]表示已经生成i位密码,匹配到模式串的位置为j(0表示不匹配)的状态的方案数量

步骤:
1、先处理出模式串的next表
2、进行状态机的转换

代码:

#include<bits/stdc++.h>

using namespace std;

const int N=53;

int f[N][N];

int ne[N];//next数组 

char str[N];//字串 

const int mod=1e9+7;

int main()
{
	int n,m;
	
	cin>>n>>str+1;
	
	m=strlen(str+1);
	
	//kmp求next表模板
	for(int i=2,j=0;i<=m;i++)
	{
		//不匹配的情况 
		while(j && str[j+1]!=str[i])
		{
			j=ne[j]; 
		}
		 
		//匹配的话则最大公共前后缀+1
		if(str[j+1]==str[i])j++;
		
		//给next表赋值 
		ne[i]=j; 
	} 
	
	//dp+状态机 
	f[0][0]=1;//已经匹配了0位,且匹配到的字符串位置(状态)是0的方案数
	
	for(int i=0;i<n;i++)//枚举密码位 
	{
		for(int j=0;j<m;j++)//枚举第i位密码在模板串中的位置	
		{
			for(int k='a';k<='z';k++)//枚举第i+1位的字符
			{
				//匹配过程:寻找当第i+1的位置是k时,并且密码已经生成了第i位,已经匹配的子串的位置是j时,能跳到哪个位置
				int u=j;
				while(u && str[u+1]!=k)u=ne[u];		
				
				if(str[u+1]==k)u++;
				if(u<m)f[i+1][u]=(f[i+1][u]+f[i][j])%mod;//因为不能包含字串,所以不能等于m
			} 
		} 
	} 
	
	int res=0;
	for(int i=0;i<m;i++) res=(res+f[n][i])%mod;
    //将所有的方案数加起来即为总方案数
    printf("%d",res);
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生命在于学习——Python人工智能原理(2.6.1)

六 Python的文件系统 6.1 打开文件 在Python中&#xff0c;可以使用内置的open函数来打开文件&#xff0c;open函数的基本语法如下&#xff1a; file open(file_name, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)参数说明&#…

IIS在Windows上的搭建

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一 概念&#xff1a; 二网络…

Mozilla Firefox正在尝试集成ChatGPT等帮助用户总结或改写网页内容

Mozilla基金会开启了一项新计划&#xff1a;在接下来几个月里尝试在Firefox浏览器里集成 ChatGPT 等 AI 服务&#xff0c;帮助用户在网页上总结内容或者改写内容等。Firefox浏览器集成的 AI 服务包括但不限于 ChatGPT、Google Gemini、HuggingChat 等&#xff0c;当然这并不是把…

vue3import的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

超详细的Pycharm使用虚拟环境搭建Django项目并创建新的虚拟环境教程

一、什么是虚拟环境&#xff1f; 通过软件虚拟出来的开发环境&#xff0c;不是真实存在的&#xff0c;一般在多套环境开发时会用到。 二、为什么要使用虚拟环境&#xff1f; 虚拟环境为不同的项目创建不同的开发环境&#xff0c;开发环境内所有使用的工具包互不影响。比如项…

安全工具 | BurpSuite安装使用(保姆级教程!)

Burp Suite下载,破解,代理web,代理模拟器 (一)为Burp Sutie下载运行执行脚本环境(Java) 1.Java官网下载地址&#xff1a;https://www.oracle.com/java/technologies/ 下载Java SE 17.0.8(LTS) 备注&#xff1a;1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持…

matlab中函数meshgrid

(1) 二维网格 [X,Y] meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵&#xff0c;每一行是 x 的一个副本&#xff1b;Y 也是一个矩阵&#xff0c;每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。 x 1:3; y…

昇思25天学习打卡营第8天 | 保存与加载 使用静态图加速

保存与加载 在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;下面是介绍如何保存与加载模型。 先定义一个模型用&#xff1a; import numpy as np import m…

grpc学习golang版( 五、多proto文件示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文件2.3 人脸唤醒proto文件2.4 生成go代码2.…

最佳Google Chrome扩展和Mozilla Firefox扩展自动解决验证码

在这个信息爆炸的时代&#xff0c;我们每天都要处理大量的在线内容&#xff0c;验证码已成为不可避免的挑战。尽管它们旨在保护网站安全&#xff0c;但也常常成为我们获取信息的障碍。那么&#xff0c;有没有更简单的方法绕过这些验证码呢&#xff1f;答案是肯定的。通过使用一…

恭喜朱雀桥的越南薇妮她牌NFC山竹汁饮料,成为霸王茶姬奶茶主材

朱雀桥NFC山竹汁饮料&#xff1a;荣登霸王茶姬奶茶主材&#xff0c;非遗传承的天然之选 近日&#xff0c;据小编了解到&#xff1a;霸王茶姬欣喜地宣布&#xff0c;成功与朱雀桥达成合作越南薇妮她VINUT牌NFC山竹汁饮料。这款商超产品凭借其卓越的品质与独特的口感&#xff0c…

小项目——MySQL集训(学生成绩录入)

ddl语句 -- 创建学生信息表 CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 学生ID,name VARCHAR(50) NOT NULL COMMENT 学生姓名,gender ENUM(男, 女) NOT NULL COMMENT 性别,class VARCHAR(50) NOT NULL COMMENT 班级,registration_date DATE CO…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

想要打造高效活跃的私域社群,这些技巧要知道

对一些企业来说“做社群等于做私域”。 在腾讯提到的私域转化场景中&#xff0c;社群与小程序、官方导购三者并列。 社群连接着品牌和群内用户。品牌通过圈住更多用户&#xff0c;来持续免费触达用户实现变现&#xff0c;用户则是从品牌方手中直接获取更多服务和优惠。那么&a…

LabVIEW中卡尔曼滤波的作用与意义

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种在控制系统和信号处理领域广泛应用的递推滤波算法&#xff0c;能够在噪声环境下对动态系统的状态进行最优估计。其广泛应用于导航、目标跟踪、图像处理、经济预测等多个领域。本文将详细介绍卡尔曼滤波在LabVIEW中的作用…

手机越用越慢?试试这4个秘籍,让手机流畅如新

智能手机作为日常生活的得力助手&#xff0c;最初总是以惊人的速度和流畅性给我们留下深刻印象。 但你有没有发现&#xff0c;随着时间的推移&#xff0c;手机似乎开始变得不那么敏捷&#xff0c;甚至出现了反应迟缓和卡顿的情况&#xff1f; 别让这个问题困扰你,下面是四个关…

基于springboot、vue影院管理系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 影城管理系统的主要使用者分为管理员和用户&#xff0c; 实现功能包括管理员&#xff1a; 首页…

从一道算法题开始,爱上Python编程

Python是一门简单易学、高效强大的编程语言&#xff0c;许多人因为它的便捷性和广泛应用而爱上编程。今天&#xff0c;我将通过一道有趣的算法题&#xff0c;带领大家一步步写出Python代码&#xff0c;并最终解决问题。希望通过这篇文章&#xff0c;能激发大家对Python编程的兴…

vue2+webpack 和 vite+vue3 配置获取环境变量(补充)

相关涉及知识点可看小编该文章&#xff1a; nginx: 部署前端项目的详细步骤&#xff08;vue项目build打包nginx部署&#xff09;_前端工程打包部署到nginx-CSDN博客 1.vue2webpack 我们通常会在项目中看到这么两个文件(没有则自己创建&#xff0c;文件名&#xff1a;.env.***) …

WITS核心价值观【创新】篇|从财务中来,到业务中去

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度&#xff0c;致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度&#xff0c;透过数字创新实践多市场的跨境交付&#xff0c;助客户保持市场领先地位。以追求卓越的不懈精神&#xf…