【刷題匯總 -- 最長回文子串、買賣股票的最好時機(一)、[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.pswp.cn/web/43874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43874.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel中用VBA實現Outlook發送當前工作簿

Excel中用VBA實現Outlook發送當前工作簿&#xff0c;首先按AltF11打開VBA編輯器&#xff0c;插入模塊&#xff0c;并在工具-引用中勾選 Microseft Outlook .0 Object Library(其中為你Microseft Outlook的版本號。 Sub 發送郵件() 保存當前excel ThisWorkbook.Save讓excel連接…

Linux 入門教程 by 程序員魚皮

本文作者&#xff1a;程序員魚皮 免費編程學習 - 編程導航網&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是魚皮。 前兩天我學編程的老弟小阿巴過生日&#xff0c;我問他想要什么禮物。 本來以為他會要什么游戲機、Q 幣卡、鼠標鍵盤啥的&#xff0c;結果小阿巴…

模擬防止重復提交

gitee地址&#xff08;需要自取&#xff09;AopProxy重復提交: 防止重復提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…

短視頻矩陣:批量發布的秘密揭秘

在數字化時代&#xff0c;短視頻已經成為一種廣受歡迎的媒體形式。無論是用于品牌推廣、產品營銷還是個人創作&#xff0c;短視頻都提供了一種直觀、生動的方式來吸引觀眾的注意力。然而&#xff0c;有效地制作、管理和發布短視頻對于許多創作者和企業來說是一個挑戰。 為此&am…

什么是 C 語言中的宏定義?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&#xff0c;看過的人都說好。 文章目…

解決 Yarn 運行時的 Node.js 版本問題:一個詳盡的指南

引言 Yarn 是一個流行的 JavaScript 包管理器&#xff0c;它與 Node.js 緊密集成&#xff0c;用于管理項目依賴。然而&#xff0c;在開發過程中&#xff0c;開發者可能會遇到 Node.js 版本不兼容的問題&#xff0c;這會導致 Yarn 運行時出錯。本文將提供一個詳細的指南&#x…

動態規劃之數字三角形模型+最長上升子序列模型

首先&#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;投影市場發展迅速目前市面上大大小小的…

華為機考真題 -- 多段線數據壓縮

題目描述: 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示,但可以發現,這種表示不是最簡的,其實只需要存儲 6 個藍色的關鍵點即可,它們是線段的起點、拐點、終點,而剩下 4 個點是冗余的。現在,請根據輸入的包含有冗余數據的多段線坐標列表,輸出其最簡化的…

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;也找不到。

nginx重啟命令linux步驟是什么?

1、驗證nginx配置文件是否正確 方法一&#xff1a;進入nginx安裝目錄sbin下&#xff0c;輸入命令./nginx -t 看到如下顯示nginx.conf syntax is ok nginx.conf test is successful 說明配置文件正確! 方法二&#xff1a;在啟動命令-c前加-t 2、重啟Nginx服務 方法一&#xff1a…

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;深受納稅人好評。但隨之而來的數電票真偽查驗問題也讓各位財務小伙伴頭疼不已&#xff0c;那么&#xff0c;數電票如何實現快速、批量、精…

移動應用性能收集工具原理解析

性能收集分析相關工具總覽 收集、分析、展示移動應用性能數據的工具很多&#xff0c;大致可以分為如下幾類。例如可收集多項性能指標的移動性能工具&#xff0c;perfdog&#xff0c;Solopi&#xff0c;其中Solopi開源&#xff0c;pefdog商業工具。可進行Crash分析的工具&#x…