談談我近乙個半月的dp練習

2022-07-19 22:57:31 字數 4080 閱讀 1723

首先十分感謝henry_y提供的50道dp練習,鏈結在這—>

雖然現在只做了30多道題,剩下的題目還沒寫,想著以後留著複習來用,但是我對dp的理解比以前高出了不少,現在我來說說對dp的想法吧。

目錄

一.動態規劃的本質,以及它的核心難點:如何判斷這題用dp來解

二.關於我做到的關於dp以外的技巧

一.動態規劃的本質,以及它的核心難點:如何判斷這題用dp來解

其實說白了,用到動態規劃的題目肯定要滿足無後效性,最優子問題這兩個關鍵,但是有些十分有趣的現象,就是如果我們看到一道題,別人沒有跟你講這道題正解是用dp做的,你橫看豎看這題也不像dp,那怎麼辦呢?(這裡給出乙個例項,有興趣的可以看一下這題 回文字串 那麼這些什麼無後效性的概念對於我們現在來講就是廢話,因為我們是真的看不出來這題竟然能用dp做,那麼現在我給出我自己對這些題目的淺薄理解。

首先,要用dp解題應要立於題目本身,題目要求有求「最大」,「最小」,「最優」等字眼時,應該要想到這題可能要用到dp;

其次,沒有頭緒時不用慌,觀察題目給的樣例資料,看看資料都是關於什麼,比如揹包問題,資料常見的給出有關於價值、容量、重量等等關鍵元素,這時候就要想一下如果我用dp來寫這題,該怎麼寫。

舉個例子,我用dp的思路,常見的就是用f[ i ][ j ]這種二維形式來推出答案,這時候我們應該要想, i 能表示什麼,j能表示什麼,假設出一種可能後,看看能不能、可不可以寫出動態轉移方程。

這裡我給出乙個例項,剛剛那題回文字串,看了題目一臉疑惑,第一反應肯定是暴力,硬搜出答案出來,但是肯定會炸裂,那該怎麼辦?

我們把目光回到那道題目上面,怎麼做?我們可以看到樣例有大寫字母,小寫字母,數字等不同的字元,注意到了嗎?不同的字元—>種類(找到第乙個元素)每個字元佔著不同的位置 —>位置(找到第二個元素) 字串的長度—>長度(找到第三個元素)就這麼多吧。

我們再來看看題目的要求,回文字串,題目樣例是ab3bd,如果我們插入它的倒序db3ba,即ab3bddb3ba,不就是個回文字串嗎?而且這麼做的話,最後字串個數肯定是偶數,因為倒過來加上去字元個數就是2n,那麼我們還可以捨棄最後乙個字母來加上去,意思是樣例是ab3bd,回文字串把它變成ab3bdb3ba,把d給刪掉乙個,不也是個回文字串嗎?那麼我們就很容易得出結論  加上去的字元數最多是  原字串長度減去1,(這裡先看到下面 1 長度 這個元素)但是有個問題,我原本就有對稱趨勢的字元,如果這麼加,不就浪費了嗎?就像樣例中的b3b,本已回文,何必再加(看到下面 2 種類 這個元素),那麼如何判斷這些可以構成回文的部分呢?根據剛剛的思路,倒過來後這些本來已經回文的子串還是回文的,那麼不就有點像lcs了嗎?我們只需找出那些倒過來還是可以弄成回文的子串(就算是斷斷續續的也無妨),不就問題迎刃而解?(看到下面 3 位置 這個元素)

現在我們要選一下哪些有用,而且要把它們應用在動態轉移方程上面

1 長度 找到了長度這個元素!那怎麼可以把它用到方程裡面,對於樣例而言,長度為5,那麼我們只能從5開始,從中間位置開始向兩邊列舉,但是沒有dp的思想在裡面啊,否決!

2 種類 回文串的種類個數是串的長度/2(單數串長度還要+1)   我們是否能這麼設定?f[ i ][ j ]表示前i 個字元一共有j種種類而需要插入的個數構成的回文串這樣子的呢?我們也易看到得出的結果跟我下乙個需要判斷的階段好像沒啥關係,因為我還是要掃一遍,這不就是搜尋了嗎?否決!

3 位置 剛剛分析過了,如果我倒過來的串的位置與原串的同一位置的字元一樣,那不就看出來這是有對稱趨勢的字元?配合lcs的思路,最後求出來的就是所以有對稱趨勢的字元的個數的值,那麼我們要求出最少插入的值不就是原串長度-求出的值不就是答案呢嗎?為什麼呢?把那些沒有對稱趨勢的字元複製在它的「對面」,這個字元就與自己的複製體就對稱了,不就從而弄出來答案就是剩下的沒有對稱趨勢的字元的個數嗎?而剩下的沒有對稱趨勢的字元不就等於原串長度-求出的值。

以上就是我對其中一題的理解,即是當我沒有任何思路時,會去想的方法。 絕不是我事先知道這題是dp才往那方向死命想的

總結一下以上的想法,我就是把題目裡面能想到的元素都寫出來,再根據題目要求乙個個去嘗試,因此我在做這些題目時,開了一維的陣列,發現好像不行,那就開二維,二維不行就上三維,直到把我能想到的且最終有用的元素都用上。

二.關於我做到的關於dp以外的技巧

1.尼克的任務(

這道題可謂是驚天水題,太水了,水的我都溺死了,一開始我一股腦的用常規dp思路,所謂常規就是i=1~n;j=1~n;f[ i , j ]=.......,結果發現連樣例都過不了,一看題解,正解要倒序......。這題我怨氣這麼多一是因為這是50道dp裡面的第3道,說是入門級別的難度我實屬是不敢相信,二是因為我在找題解,看正解為什麼應該要用倒序時,發現了一些dalao,他們寫題解都是怎樣的呢?「唔~普及組水題」「這題顯然是....」等等,我很想說一句,但凡你們認真一點,照顧照顧一下我這些菜雞,寫題解時多一點解釋,少一點顯然,我也不至於對dp一直有種畏懼的心理。額,這些都是題外話,回到題目,這題可能是我見過的第一道要用倒序dp來做的題目(除去揹包問題),算是長見識了。最後說一句,這題一點都不水!

2.lis的n log n 做法(50道題目裡面比較多用到)

這個做法我一開始是一臉懵逼的,最後理解了才發現,其實這種做法不僅僅能適用於這裡,這更算是一種思想,一種最優化的思想,我覺得有點難解釋,我把這種做法比喻成排隊吧,如果有人比現在這個佇列裡面最高的人還要高,就把他放在最前面,如果不夠最高那個人高,就在佇列裡面找到所有比他高的人裡面最矮的那乙個,然後把它替換,這樣有利於把後面的人給加進來,為什麼呢?如果乙個人170,他想要加入隊伍,現在這個隊伍

裡面最高的人

是175,第二高的人是168,這時候我把175的換走,人數不變,此時最高的是170,便於以後想要加進來的171、172、173、174的人排到最前面,隊伍人數增多,而不是讓他們走人。

3.對dp出來一遍的陣列再進行dp一遍(

長見識了,我現在都雲裡霧裡的對這題

4.dp與離散化的結合(

這幾題以後一定要重新做一遍,對於一些有兩個排序標準的題目很有幫助,而且我初步了解到了離散化資料的魅力,其實這個理解起來也不難,就是對於隨便一串東西,把它做成乙個對映,變成有排列順序的數字1 2 3 4 等等,做完題輸出的時候再反向對映一遍,巧妙吧,我特別想問誰發明的,真的牛啤。

4.dilworth定理的意思:最少的下降序列個數就等於整個序列最長上公升子串行的長度  (有些東西記住就好,不要太在意,要不然頭頂會涼)

5.斷鏈成環(

這個我要重點提一下,因為我對環的知識還沒有很深,所以做題常常碰壁,這題也不例外,那這題怎麼說呢?這題讓我懂得了乙個道理,我設出來的東西可以不用,我可以只是為了我的**簡潔,迴圈起來不用寫那麼多限制條件,最後輸出的時候輸出我要求的東西就行。回歸正題吧,環的處理有兩種,可以選擇(i+1)%n的方式,但也可以將n個元素複製一遍,變成2*n個元素,簡化**,我剛剛說的道理就是從2*n個元素這種方法得出來的。總而言之,我之後要做多一點關於環的題目吧。

6.與二分的結合(

雖然核心dp**裡面沒有用到二分優化什麼的,純屬算是題目要求,但是我想說一句,這是2017普及組的題目???相對而言算難的吧.......

7.單調佇列優化(

又是長見識的時間,單調佇列我就不說了,現在我還只會手寫佇列,等到會用stl庫再來寫寫這題吧。其實做完這題的時候我思考了這樣乙個問題,既然我dp都在找以前的最優值,那麼什麼時候可以用類似的演算法,把以前的最優都處理一下,直接省掉一重迴圈(思考ing......)

8.dag上的dp(

一開始這題我連題目都看不懂的,看了題解還算是懂了那麼一點(對於乙個高考語文分數107即三年巔峰的人來講,這種題目描述實屬是難頂),其實這題我更想把它叫為遞推,因為對於每個點直接加上連線點的值就好了,說是dp也無妨吧。

數學的角度看股市 我的股市經歷 乙個半月小結

我的 經歷也有 乙個半月了.回想起,年前開始關注 起初不為所動,最後公司讓考個 從業資格考試,做金融軟體的公司,這也算熟悉一下業務吧 年前新開始動了,可是沒錢 應屆畢業生 過年回來後,把自己 所有的錢 1w多 開始了 經歷.數學系裡我是第乙個開始搞 的,或許我做的不是純數學,而且與數學 離的越來越遠...

談談我對打造乙個成功站點的看法

在如今的這個網際網路高速發展的時代,打造乙個高權重的 是很多站長和企業夢寐以求的事情,說簡單一點就是要打造乙個能夠給站長和企業帶來收益的 那麼首先就得有乙個好的 排名,有高流量,這往往是乙個難點,也是大家做網路營銷最關鍵的乙個步驟,那麼下面筆者就來談談我對於打造乙個完美 的看法 1 內外鏈建設合理 ...

jmp 乙個近跳轉的問題

前天,複習彙編時,看到jmp的short跳轉,跳轉範圍為 128,127 馬上我想到jmp的near跳轉應該為 32738,32767 並且我寫了乙個程式來測試這一想法,程式如下 org 0100h jmp label start section code16 bits 16 label start...