【刷题汇总 -- 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒】

C++日常刷题积累

  • 今日刷题汇总 - day010
    • 1、最长回文子串
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现
    • 2、买卖股票的最好时机(一)
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现
      • 2.4、程序实现 -- 优化
    • 3、[NOIP2002 普及组] 过河卒
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 -- dp
    • 4、题目链接

今日刷题汇总 - day010

1、最长回文子串

1.1、题目

在这里插入图片描述

1.2、思路

读完了题知道,在一个长度为n的字符串中,求最长回文子串的长度。回文子串可以理解为对称的字符串。因为具有对称性,那么基本思路就是“中心扩展法”,也就是依次字符串,然后遍历到该字符就向其两边扩展,如果两边的字符相等,那么就记录到retlen变量中,遍历完最后得到最大长度返回即可。为了方便理解,画个图:
在这里插入图片描述
此外,分析示例,还得注意奇数偶数的区别,那么接下来就是程序实现。

1.3、程序实现

首先,按照思路分析的“中心扩展法”,遍历字符串,且从i处从中心站展开,依次求得的retlen,与retlen不断比较更新,然后又因为需要区分奇数和偶数的情况,所以分别求得最大值,最后再比较依次得到最终最大的retlen返回即可。

class Solution
{
public:int getLongestPalindrome(string A){size_t len = A.size();int left = 0;int right = 0;int retlen = 0;//偶数for(int i = 0;i < len; i++){left = i;right = i + 1;while(left >= 0 && right < len && A[left] == A[right]){left--;right++;}retlen = max(retlen ,right - left - 1);}//奇数for(int j = 0;j < len;j++){left = j;right = j;while(left >= 0 && right < len && A[left] == A[right]){left--;right++;}retlen = max(retlen ,right - left - 1);}return retlen ;}
};

在这里插入图片描述

在这里插入图片描述

2、买卖股票的最好时机(一)

2.1、题目

在这里插入图片描述

2.2、思路

读完题,知道对于一组股票的买卖机制,只能买卖一次,让求得获得的利润的最高收益,如果无论什么时候买入卖出都是亏,不管亏多少,即没有利润则输出0即可。那么,基本思路就是枚举/蛮力法,求得每一组的利润差,返回最大值,尝试过后,发现两层for会超时,此题限制1ms解决。因此,需要在蛮力法基础上优化,所以蛮力法也写一写,然后,基于蛮力法,回溯重复了太多次,进行优化,思考发现,如果我们反过来逆向思维,先考虑卖出的价值,然后,就只需要求得该卖出点之前的最小价值即可,得到的差就是最大差,也就是说只需要遍历一遍即可。接下来就是程序实现。

2.3、程序实现

首先,根据蛮力法思路分析,依次枚举所有情况,求得最大差值输出即可,此题会超时。所以得进行优化。

#include <iostream>
using namespace std;const int N = 1e5 +10;int arr[N];int main()
{int n;cin >> n;for(int i = 0;i < n;i++)cin >> arr[i];int maxval = 0;for(int i = 0;i < n; i++){for(int j = i;j < n;j++){maxval = max(maxval , arr[j]- arr[i]);}}cout << maxval << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述

2.4、程序实现 – 优化

基于上述的蛮力法,进行优化,为了方遍理解,根据思路分析画个演示图:
在这里插入图片描述
那么程序实现,按照要求写好输入,然后定义minval初始化arr[0]当作假设的最小值进行遍历比较更新即可,再定义一个maxSub表示遍历至 i 位置时,与minval的最大差值,值得注意的是,遍历时注意minval和maxSub的顺序性,先求最小值minval再求maxSub即可。

#include <iostream>
#include <vector>
using namespace std;int main() 
{int n = 0;cin >> n;vector<int> arr(n);int m = 0;while(n--){cin >> arr[m];m++;}int minval = arr[0];int submax = 0;for(int i = 0;i<arr.size();i++){minval = min(arr[i],minval);submax = max(submax, arr[i] - minval);}cout << submax << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

3、[NOIP2002 普及组] 过河卒

3.1、题目

在这里插入图片描述

3.2、思路

读完题,知道让求从A点按照一定的规则,走到B点最多有多少条的路径。分析题目需要知道,按照一定的规则,可以向右或向下走就想到了动态规划dp思路,然后题目中还需要注意的是,马的控制点不能被走(访问),也就是象棋中马在坐标上走的斜"日"所设计的点,且包括马的起始点都被称为控制点。其中,马是一开始就给出的固定点(x,y),且题目也给了马跳跃点与马起始点的关系。此外,还得注意的是,根据示例和棋盘得知,棋盘的大小是(n+1)(m+1)。
所以,综合所述,思考分析得出:
(1)、可使用动态规划dp思路解题;
(2)、马的控制点,除了斜“日”外,还包括自身的起始位置;
(3)、棋盘的大小是(n+1)
(m+1).
所以分析了注意点后,那么就回归到动态规划的dp状态表示和状态转移方程上来;
由题目的走的规则,定义dp[i][j]状态表示:走到该位置最多有几条路径;
推导状态转移方程:dp[i][j] = d[i][j-1] + d[i-1][j] ;
此外注意如果B点起始位置就与马的起始位置或控制点重合,还有就是B点的上方和左方全部被阻塞,即是控制点,那么以上极端情况,此时dp[i][j] = 0; 那么接下来,就是程序实现。

3.3、程序实现 – dp

首先,根据思路的分析写好输入,定义开辟好dp数组(两个坑点稍后说),根据棋盘的大小为了坐标能够统一描述所以这里就额外多开辟一行一列,那么x和y就需要映射坐标+=1即可,然后探究dp的初始化问题,画个图更清晰:
在这里插入图片描述
接着,实际二维数组就从[1,n+1]和[1,m+1]遍历,不断判断极端情况的处理即可,最后输出dp[n+1][m+1]即可。到此,思路没有问题,总结步骤为一下几点:
(1)、映射x和y的坐标;
(2)、根据(多开辟一层)数组定义初始化dp[0][1] =1 或 dp[1][0] = 1均可;
(3)、遍历二位数组,注意边界控制从[1,n+1]和[1,m+1]遍历;
a、判断极端情况:1.马的控制点阻塞路径 2.重合问题;
b、正常执行状态转移方程:dp[i][j] = d[i][j-1] + d[i-1][j] ;
(4)、最后输出dp[n+1][m+1]即可.
另外,上面提到的两个坑点,在于我写好后,提交不通过,发现,数据超范围了,所以最好使用long long开辟数组,还有一个坑点是在于开辟的大小范围由于多开辟的一层使用,所以这里至少大于等于22才行。之前使用dp[21][21]无法通过所有用例哈。

#include <iostream>
using namespace std;long long dp[22][22];int main()
{int n,m,x,y;cin >> n >> m >> x >> y;//映射坐标x += 1;y += 1;//初始化dp[0][1] = 1;//遍历for(int i = 1;i <= n+1; i++){for(int j = 1;j <= m+1; j++){//极端情况的处理:  1.马控制点 2.自身重合if((i != x && j != y && abs(i - x) + abs(j - y) == 3) || (i == x && j == y)){dp[i][j] = 0;}else{dp[i][j] = dp[i][j-1] + dp[i-1][j];}}}cout << dp[n+1][m+1] << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

4、题目链接

最长回文子串
买卖股票的最好时机(一)
[NOIP2002 普及组] 过河卒

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

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

相关文章

Linux 入门教程 by 程序员鱼皮

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是鱼皮。 前两天我学编程的老弟小阿巴过生日&#xff0c;我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的&#xff0c;结果小阿巴…

短视频矩阵:批量发布的秘密揭秘

在数字化时代&#xff0c;短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作&#xff0c;短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而&#xff0c;有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…

什么是 C 语言中的宏定义?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

动态规划之数字三角形模型+最长上升子序列模型

首先&#xff0c;我们从集合角度重新看待DP&#xff1a; 直接看题&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取纸条的原题&#xff0c;我们令f[i1,j1,i2,j2]表示从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的max i1j1i2j2&#xff0c;于是我们可以把状…

机器学习 | 对K-Means聚类假设的研究演示及实践示例

我们在Scikit-learn对K-means假设的调查中探索了揭示算法优势和局限性的场景。我们研究了K-means对不正确的聚类大小的敏感性&#xff0c;它在各向异性分布中面临的困难&#xff0c;它在不同的聚类方差中面临的困难&#xff0c;以及使用合成数据集的大小不均匀的聚类问题。我们…

准备工作+1、请求和响应+2、模型和管理站点

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;用于开发的简易服务器&#xff08;3&#xff09;创建投票应用&#xff08;4&#xff09;编写第一个视图1、编写…

家用激光投影仪品牌排行榜:这几个品牌口碑好产品好最适合家用

现在人们生活水平提升&#xff0c;对投影这类产品的认知接受度也提升&#xff0c;有条件的家庭都想在家里整一个家庭影院&#xff0c;对于这些消费者来说挑选一台性价比高的家用投影至关重要&#xff0c;既省到钱又买对了产品&#xff1b;投影市场发展迅速目前市面上大大小小的…

mongo数据库迁移

前言 mongo数据库迁移的方式目前常见的有两种&#xff1a; 1&#xff0c;mongodump与mongorestore 2&#xff0c;mongoimport与mongoexport 二者主要区别有&#xff1a; 1、mongoexport 可以导出json和csv格式&#xff0c; mongodump导出的是bson可读性不如前者 2&#xff0c;…

在Windows 10上快速显示桌面的几种方法,总有一种适合你

序言 有时你需要在Windows 10中快速查看你的桌面,但你不想乏味地最小化每个打开的应用程序窗口,或者移动它们并丢失它们的布局。幸运的是,有几种方法可以让你快速查看桌面,然后从你停止的地方重新开始。 如何使用任务栏按钮显示桌面 假设你正在随意浏览你最喜欢的网站,…

服了,jenkins找不到advanced

新手下载的最新版本&#xff0c;过新手入门的时候一直过不去&#xff0c;就跳过了。 想下载一个汉化&#xff0c;还下载不了。根据提示搜索&#xff0c;结果大家让去advanced找url&#xff0c;也找不到。

FreeRTOS 队列

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据&#xff0c;队列中的每一个数据叫做队列项目&#xff0c;队列能够存储队列项 目的最大数量称为队列的长度&#xff0c;在创建队列的时候&#xff0c;就需要指…

揭秘与应对:病毒伪装文件夹的数据恢复策略

在数字时代&#xff0c;数据安全是每个人不可忽视的重要议题。而伪装文件夹&#xff0c;作为一种狡猾的数据安全威胁&#xff0c;正逐渐浮出水面&#xff0c;成为用户需要警惕的对象。这些伪装文件夹看似普通&#xff0c;实则隐藏着不为人知的秘密&#xff0c;它们通过模仿正常…

linux系统操作/基本命令/vim/权限修改/用户建立

Linux的目录结构&#xff1a; 一&#xff1a;在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用:/来表示 注意:1、开头的/表示根目录 2、后面的/表示层级关系 二&#xff1a;在windows系统中&#xff0c;路径之间的层级关系&#xff0c;使用:\来表示 注意:1、D:表示…

移动应用性能收集工具原理解析

性能收集分析相关工具总览 收集、分析、展示移动应用性能数据的工具很多&#xff0c;大致可以分为如下几类。例如可收集多项性能指标的移动性能工具&#xff0c;perfdog&#xff0c;Solopi&#xff0c;其中Solopi开源&#xff0c;pefdog商业工具。可进行Crash分析的工具&#x…

猫超卡怎么使用?

天猫超市卡好像只能买天猫的东西 但是有时候淘宝、京东打折比天猫的单价还便宜 这样的话&#xff0c;猫超卡好像也没多大用处 这不&#xff0c;上个月618凑单的东西比在天猫超市买划算多了 最后我直接把猫超卡在收卡云上折现了&#xff0c;超划算

编程学单词:delta(希腊字母Δ/δ)

希腊字母表的第四个字母&#xff0c;大写为Δ&#xff0c;小写为δ。 (笔记模板由python脚本于2024年07月11日 12:32:56创建&#xff0c;本篇笔记适合喜欢写代码&#xff0c;更喜欢鼓捣Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.pyth…

算法 | NOIP1999 Cantor表

算法篇——Cantor的数表 - SteveWang - 博客园 (cnblogs.com) #include <bits/stdc.h> using namespace std; int high(int n) {return n*(n1)/2; } int main() {int k;cin>>k;int n1;while(1){if(high(n)>k){break;}n;} int mhigh(n);int wm-k1;if(n%20){cout…

Arcgis Api 三维聚合支持最新版API

Arcgis Api 三维聚合支持最新版API 最近有同学问我Arcgis api 三维聚合&#xff0c;官方还不支持三维聚合API&#xff0c;二维可以。所以依旧是通过GraphicLayers 类来实现&#xff0c;可支持最新Arcgis Api版本 效果图&#xff1a;

《计算机研究与发展》投稿经验

前言 记录下投计研展正刊的经验。跟专刊不同哈&#xff0c;专刊会更快&#xff0c;我看好像也有专刊的经验分享。【计算机研究与发展投稿记录】 期刊简介 来源计研展官网&#xff1a; 《计算机研究与发展》是中国科学院计算技术研究所和中国计算机学会联合主办的学术性期刊&a…

盲人出行体验攻略:蝙蝠避障,点亮前行的明灯

在繁华喧嚣的都市中&#xff0c;每一步都充满了未知与挑战&#xff0c;而对于盲人朋友们来说&#xff0c;出行更是一场无声的冒险。他们凭借着内心的勇气和坚韧的意志&#xff0c;在黑暗中摸索前行&#xff0c;每一步都承载着对生活的热爱与追求。今天&#xff0c;我们要深入探…