秋招突击——算法打卡——6/5——提高{(状态机模型)股票买卖、(单调队列优化DP)最大子序列和}——新做:{考试的最大困扰度}

news2024/11/17 21:16:29

文章目录

    • 提高
      • (状态机模型)股票买卖IV
        • 思路分析
        • 实现代码
        • 参考代码
    • 新作
      • 考试的最大困扰度
        • 个人实现
        • 参考思路
    • 总结

提高

(状态机模型)股票买卖IV

  • 上一次的思路总结,上次写的时候忘记总结了,现在重新画一下图
  • 在这里插入图片描述
思路分析
  • 这道题是一个经典的状态机模型,具体分析如下,两种做状态以及对应的转换形式。
    请添加图片描述
实现代码
  • 一写代码就懵逼,不知道怎么定义边界值,是从零开始还是从一开始,要不要给边界赋值?都不知道,得找一个方法,一块解决掉。
  • 忘记怎么用memset,需要好好整理一下。
    • memset是来自cstring的
    • memset(ptr,value,sizeof())
  • 写成了下面这样
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 10010;
const int K = 110;
int w[N],k,n;
int f[N][K][2];

int main(){
    cin>>n>>k;
    for (int i = 0; i < n; ++i) {
        cin>>w[i];
    }


    // 遍历所有的边界进行赋值
    memset(f, 0, sizeof(f));
//    for (int i = 0; i <= k; ++i) {
//        f[0][k][0]  = 0;
//        f[0][k][1]  = 0;
//    }
//    // 遍历所有零次交易的情况
//    for (int i = 0; i <= n; ++i) {
//        f[k][0][0] = 0;
//        f[k][0][1] = 0;
//    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= k; ++j) {
            f[i][j][0] = max(f[i - 1][k][0] , f[i - 1][k][1] + w[i]);
            f[i][j][1] = max(f[i - 1][k][1] , f[i - 1][k-1][0] - w[i]);
        }
    }

    cout<<max(f[n][k][0],f[n][k][1])<<endl;
}
参考代码
  • 大体是一样,但是有两个问题,分别
    • 最大值的确定
      • 最后肯定是全部都卖光的情况,手里没有持有股票才对,所以只需要比价状态0就行了
      • 最后有可能交易次数没有用光,所以可能要遍历最后一天所有交易次数的情况
  • 关于初始化的问题
    • 因为有可能 是负数,所以最开始的初始值要是最小的。
    • 因为再交易过程中,交易天数会为0,同时交易次数也会为0,因为都存在-1的情况,所以要对两者进行判定
      • 在第零天第零次交易的情况下,自身的收益本身就是0,存在f[i-1][j-1][0]的情况
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 10010;
const int K = 110;
int w[N],k,n;
int f[N][K][2];

int main(){
    cin>>n>>k;
    for (int i = 0; i < n; ++i) {
        cin>>w[i];
    }


    // 遍历所有的边界进行赋值
    memset(f, INT_MIN, sizeof(f));
    for (int i = 0; i <= n; ++i) {
        f[i][0][0] = 0;
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= k; ++j) {
            f[i][j][0] = max(f[i - 1][k][0] , f[i - 1][k][1] + w[i]);
            f[i][j][1] = max(f[i - 1][k][1] , f[i - 1][k-1][0] - w[i]);
        }
    }
    int res = 0;
    for (int i = 0; i <= k; ++i) {
        res = max(res, f[n][i][0]);
    }
    cout<<res<<endl;
}

新作

考试的最大困扰度

  • 题目链接
个人实现
  • 最直白的思路,统计一下所有的相同的T或者F的数量,然后将之转成数字,就变成了52146
  • 改变其中某一个数字,形成新的序列,然后比如说选中2,最终就变成了846.然后在选择其中的最大值。最为输出
  • 这样的话情况太多了,遍历的情况太多了,不好弄。
  • 序列问题,使用双指针?
  • 左边指针固定,右边指针向右进行遍历,如果相同就不改变k,如果不同就改变k,然后知道返回最终结果为止。
class Solution {
public:
  int maxConsecutiveAnswers(string s, int k) {
    int n = s.size(),kTemp = k;
    int res = 0;
    for (int l = 0; l < n;l ++) {
        int r = l+1;
        while(r < n && (s[l] == s[r] || kTemp > 0)){
            if (s[l] != s[r]){
                kTemp --;
            }
            r ++;
        }
        res = max(res,r - l );
        // 重置并重新移动l
        while(l + 1 < n && s[l] == s[l + 1]) l++;
        kTemp = k;
    }

    kTemp = k;
    for ( int r = n - 1; r >= 0;r --) {
        int l = r - 1;
        while(l >= 0 && (s[l] == s[r] || kTemp > 0)){
            if (s[l] != s[r]){
                kTemp --;
            }
            l --;
        }
        res = max(res,r - l );
        // 重置并重新移动l
        while(r - 1 >= 0 && s[r] == s[r - 1]) r --;
        kTemp = k;
    }
    return res;
}
};
  • 就算再来一遍,双指针,还是只能通过60个样例,不够。
    在这里插入图片描述
参考思路
  • 这道题我们用的思路是一致的,不过他是将这个问题分开,也是使用双指针的,但是是分别计算最长的F的序列和最长的T序列,然后再求两个最大值。
  • 思路变化
    • sum表示区间中非目标值的字符个数
      • sum < k:说明可以使用的k个操作进行翻转
      • sum > k:说明不能使用的k个操作进行反转,这里要不断移动j,减少不合法的字符的个数。
  • 其中第二段的思路我没有意识到,我这里做错了,我这里是直接移动到第一个与当前符号不一样的字符那里,是一个问题。
  • 这个模板好好记一下!
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int maxConsecutiveAnswers1(string s, int k,char t) {
    int n = s.size();
    int res = 0;
    for (int l = 0,r = 0,sum = 0; r < n;r ++) {
        if (s[r] != t)  sum ++;
        while(sum > k){
            if (s[l] != t) sum --;
            l ++;
        }
        res = max(res , r - l + 1);
    }
    return res;
}

int maxConsecutiveAnswers(string s,int k){
    return max(
            maxConsecutiveAnswers1(s,k,'F'),
            maxConsecutiveAnswers1(s,k,'T')
               );
}

int main(){
    cout<<maxConsecutiveAnswers("TTFF",2)<<endl;
}

总结

  • 关于状态机模型,大概写对了,但是没有抓住精髓,还是对于边界的初始化有问题,不过这次有点意识了。
    • 除了根据实际意义来看,0次操作的情况下,就是没有任何收益
    • 凡是存在了-1的情况的话,都需要进行初始化,防止访问0的边界
  • memset,是来自于cstring,无论是几个维度的数据,都是使用的f + sizeof(f)
  • 今天还不错,继续加油。

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

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

相关文章

Python | Leetcode Python题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:start, cur_res, total_res 0, 0, 0for i in range(len(gas)):cur_res gas[i] - cost[i]total_res gas[i] - cost[i]if cur_res < 0:cur_r…

【ArcGIS微课1000例】0017:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

详解!Python怎么配置环境变量

详解&#xff01;Python怎么配置环境变量 许多刚开始学习编程的初学者在 python的安装上会抱有一定的疑惑&#xff0c;为什么明明已经安装好了 python 环境&#xff0c;但并不能运行python 代码&#xff0c;这是因为 python 的安装过程中还有一步环境变量的配置&#xff0c;接…

Java速成要多久?这篇文章告诉你答案!

Java速成要多久&#xff1f;这篇文章告诉你答案&#xff01; Java作为一门用途广泛且经久不衰的编程语言&#xff0c;吸引了无数学习者的目光。许多人希望能够快速掌握Java&#xff0c;以便进入软件开发行业或者提升自身的竞争力。那么&#xff0c;Java速成究竟要多久呢&#x…

51建模网3D编辑器:一键为3D模型设置特殊材质

3D设计师要对3D模型设置玻璃或者钻石材质时&#xff0c;操作比较复杂&#xff0c;但是利用51建模网的3D编辑器&#xff0c;不用下载安装软件&#xff0c;在线通过浏览器即可编辑&#xff0c;具有一键设置特殊材质的功能。目前&#xff0c;它支持钻石材质、玻璃材质和水波纹材质…

微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor

前言 今天大姚给大家分享一个由微软官方开源&#xff08;MIT License&#xff09;、免费的Blazor UI组件库&#xff1a;Fluent UI Blazor。 全面的ASP.NET Core Blazor简介和快速入门 Fluent UI Blazor介绍 Fluent UI Blazor是一个基于Blazor的组件库&#xff0c;提供了一系…

Hadoop3:MapReduce之MapTask的Job任务提交流程原理解读(1)

3、Job工作机制源码解读 用之前wordcount案例进行源码阅读&#xff0c;debug断点打在Job任务提交时 提交任务前&#xff0c;建立客户单连接 如下图&#xff0c;可以看出&#xff0c;只有两个客户端提供者&#xff0c;一个是YarnClient&#xff0c;一个是LocalClient。 显然&a…

xtsk—选择自由

最近和一些自由职业者交流时深刻感受到&#xff0c;系统思考不是为了创造更多的工作&#xff0c;而是为了创造更多的自由。我们工作的最终目的&#xff0c;实际上是为了达到不需要为了生存而工作的自由状态&#xff0c;赚钱只是手段&#xff0c;其本质是为了赢得更多的选择权。…

PySide6在VScode中提示:vscode module not found error: no module named ‘pyside6‘解决方案

最近在B站学习PySide6&#xff1a;PySide6百炼成真&#xff0c;带你系统性入门Qt https://www.bilibili.com/video/BV1c84y1N7iL?p3&vd_source256724e7f8bba144c62a17f9fa758a04 学习到第3节&#xff1a;003基础框架 003基础框架 from PySide6.QtWidgets import QApplicat…

如何将华为Ascend手机的短信和联系人安全传输到电脑

华为Ascend系列手机以其流畅的使用体验、光滑的触感以及轻巧的设计赢得了市场的青睐。不仅如此&#xff0c;Ascend系列手机还以亲民的价格和出色的用户体验&#xff0c;搭载了众多先进功能&#xff0c;如Ascend P6的4.7英寸大屏、海思四核处理器、2GB RAM和800万像素摄像头等。…

Linux之文件操作

目录 第1关&#xff1a;文件的创建 任务描述 相关知识 文件的创建 编程要求 答案&#xff1a; 第2关&#xff1a;文件打开与关闭 任务描述 相关知识 文件的打开 文件的关闭 编程要求 答案&#xff1a; 第3关&#xff1a;文件读写操作 任务描述 相关知识 文件的写操作 文件的读…

工商注册代理记账——打造专业服务的专业机构

在当今竞争激烈的商业环境中&#xff0c;注册和运营一家公司成为了每一个企业家的重要步骤&#xff0c;这并不是一件容易的事&#xff0c;涉及到的不仅是法律法规的学习&#xff0c;还有各种手续的办理、税务筹划等问题&#xff0c;这个时候&#xff0c;就需要专业的工商注册代…

云原生时代:从 Jenkins 到 Argo Workflows,构建高效 CI Pipeline

作者&#xff1a;蔡靖 Argo Workflows Argo Workflows [ 1] 是用于在 Kubernetes 上编排 Job 的开源的云原生工作流引擎。可以轻松自动化和管理 Kubernetes 上的复杂工作流程。适用于各种场景&#xff0c;包括定时任务、机器学习、ETL 和数据分析、模型训练、数据流 pipline、…

【因果推断python】17_工具变量3

目录 简化形式 手动工具变量 多个工具变量 工具变量的弱点 关键思想 简化形式 不幸的是&#xff0c;我们无法验证第二种IV条件。我们只能支持它。我们可以表达我们的信念&#xff0c;即出生四分之一不会影响潜在的收入。换句话说&#xff0c;人们出生的时间并不表示他们的…

8.22 PowerBI系列之DAX函数专题-盈亏平衡分析

需求 实现 一、用参数设置固定成本&#xff0c;单位变动成本&#xff0c;与毛利率 1 单位变动成本 generateseries(0,100,1) 2 固定成本 generateseries(0,50000,1) 3 毛利率 generateseries(0,0.4,0.01) 二、度量值 1 总变动成本 [单位变动成本 值]*[销量 值] 2 总成本…

Docker配置 之 本地仓库web访问

介绍 Docker是一种开源的应用容器引擎。 Docker可以让开发者打包应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何安装了Docker引擎的服务器上&#xff08;包括Linux机器、Windows机器&#xff09;&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

2024国内热门大语言模型在科研方面的应用

本博客总结了几款热门的国产大语言模型&#xff0c;帮助大家利用这些大语言模型更好的进行科研。 模型介绍 1.文心一言 链接:https://yiyan.baidu.com/ 开发方&#xff1a;百度 特点&#xff1a;专注于中文语言理解与生成&#xff0c;适合中文文本的语义理解任务。 百度推出…

go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

什么是JWT JWT,全名为JSON Web Token&#xff0c;是当下主流的一种服务端通信认证方式&#xff0c;具有轻量,无状态的特点&#xff0c;它实现了让我们在用户与服务器之间传递安全可靠的Json文本信息&#xff0c;它的使用过程主要是这样的&#xff1a; 当用户注册的时候&#x…

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时&#xff0c;每执行一条import语句都会创建一个新的命名空间&#xff08;namespace&#xff09;&#xff0c;并且在该命名…

python--面向对象-文件读写-异常

一、继承 定义一个类时&#xff0c;需要使用另外一个类的方法或属性&#xff0c;就可以通过继承实现 object是Python的顶级类&#xff0c;创建类是会自动继承&#xff0c;就拥有object中的方法 定义格式 # 类的定义 # 旧式类定义 一般在定义单个类时使用 class 类名:name N…