福州0209 DAY5 動態規劃模型

2021-08-15 13:20:31 字數 2705 閱讀 6053

真正的巨坑,一寒假都寫不完,慢慢來。

另,上課的學長(叫老師真的顯得好老))好溫和啊,這幾天來第一次聽這麼透徹,甚至突然想好好學習一晚上。………………

階段:把所給求解問題的過程恰當地分成若干相互聯絡的階段。

一般是按某種線性關係劃分的,比如時間先後etc。

狀態:表示每個階段的自然狀況/客觀條件,是不可控制因素。

……教材上的說法太學究了,就是表示決策目前的乙個狀態,字面意思。

最優化原理:無論過去狀態和決策如何,對前面的決策所形成的狀態而言, 餘下的諸決策必須構成最優策略。簡而言之,乙個最優化策略的子策略總是最優的。

乙個問題滿足最優化原理又稱具有最優子結構。

dp和貪心都是從區域性最優解推出全域性最優的演算法,而且同樣具有最優子結構。然而貪心的最優只對當前做的這一步選擇負責,即它只保證在當前的選擇中這一步是最優的,所以貪心的全域性正確性要嚴格的證明。而dp則是每時每刻保證過去的區域性都是最優的,並逐步擴大問題規模,而且一般能記錄子問題最優解。

*我不知道,我瞎說的。*

tip:當發現設定的狀態無法滿足最優子結構時,通常咳採用增加狀態維度的方法。

無後效性:當前狀態是此前歷史的完整總結,過去只能通過當前狀態影響之後的過程。

……貪心是有後效性的。

子問題重疊性:dp實際上是搜尋的優化,將指數級的搜尋演算法改進為有多項式複雜度的演算法。它的根本目的在於解決了搜尋中大量重複的子問題(記憶化搜尋,我們把那些重複的問題作為狀態存下來了),所以這是一種空間換時間的技術。

*dp的子問題是相對於全域性而言、逐漸擴大範圍直至全域性的,而分治是把總問題拆成一堆區間單獨處理。

…… 故得狀態轉移方程:dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1]。

當然,在這個大區間計算的時候,如果s[i]==s[j],那麼顯然dp[i][j] += dp[i + 1][j - 1] + 1.

poj 2955

給出乙個括號字串,問這個字串最長合法子串行長度。若a、b合法,則ab;(a)合法。

dp[l][r]表示[l,r]中最長合法子串行長度。

則有狀態轉移方程:

if(s[i]==s[j]) dp[l][r]=dp[l+1][r-1]+2.

dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]).列舉k。

比如,(()[ ()],假設k是空格前一位。則dp[l][k]=2,dp[k+1][r]=2,此時dp[l][r]=4,但是當k再前移一位時,dp[l][k]=2,dp[k+1][r]=4,dp[l][r]=6.

為什麼不在dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])之後判斷若s[i]==s[j],dp[i][j]+=2?

因為dp[l][k]可能已將s[l]匹配了另外的某個括號,dp[k+1][r]同理,故不可行。

那如果把轉移方程改為dp[l][r]=max(dp[l][r],dp[l+1][k]+dp[k+1][r-1])再判斷嗎?也不行,因為存在dp[l][k]+dp[k+1][r]可能更優的情況。

所以,如果一定要先狀態轉移再判斷,那麼:

dp[i][j]=max(dp[i][i+k]+dp[i+k+1][j])

if(s[i]==s[j]) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2).

……說這麼多其實沒什麼特別的意義。

它其實是乙個首尾相連的區間。

codevs 2102 合併石子

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.

第一步,斷環為鏈,即將鏈複製一遍。a[i+n]=a[i].

d[i][j]表示合併第i到第j堆的最高得分。以區間長度為關鍵字公升序計算。

多公尺諾骨牌覆蓋

n*m的矩陣,用1*2的骨牌完全覆蓋,骨牌不重疊。求不同的覆蓋方法總數。模p。m<=5=,n<=10000.

怎麼表示狀態呢?m很小,完全可以狀壓。例如,5*4的矩陣,由於第2行的影響,第3行的第2、3列已經被牌佔據了,那麼用二進位制表示即為0110.

f[i][j]表示第i行狀態為j時的方案總數。

如何實現狀態轉移?我們先通過搜尋,預處理乙個陣列g[x][y],表示從x狀態變為y狀態的方法數。

於是f[i][j]=σf[i-1][k]*g[k][j];列舉k狀態。

o(n*2^m*2^m),常數寫小一點應該ok。

noip2016 憤怒的小鳥

題目大意:用過原點的拋物線覆蓋n個座標點,求最少需要的拋物線數量。n<=18.

根據初中數學,三點確定一條拋物線。原點已知,故列舉剩下兩個點。

p[j]表示列舉的第j條拋物線。

福州集訓DAY4

上午講的數論我基本都會 但是題目都不會做啊 有這些注意點 c 中的模運算和通常意義上的mod模運算是不一樣的。c 中 運算保留符號,也就是負數取模之後還是負數。但是通常意義上的mod運算得到的結果都是自然數。c 的 並不是向下取整,而是向0取整。先把符號去掉,再向下取整,再添上符號 原根的概念和用法...

寒假 福州集訓 Day4

後補的.這天的早上仍然考試,沒有爆零的我簡直興奮。t1 資料我覺得有點大 做不來 就準備拿個暴力分 直接用了遞迴 我想了很多辦法優化 包括儲存加數的方法數什麼的 但是都沒有成功 所以我最後只拿了20的暴力分 t2 是我沒考慮周全 沒有考慮 兩點在同一位置的時候線路最短的情況 只是單純的分別找了兩個點...

2018寒假福州集訓記Day1

哦 今天上午直接一波考試。之前1個月都在準備期末考試,資訊書都沒翻過,考試前臨時抱佛腳,然而並沒啥卵用。好了不談了,說說題目吧。t1是一道dp題目 我考完試才知道,考試的時候我也有想過可能與遞推有關 題目給的樣例剛好是兩種極端的情況,一種是每行語句下面都加乙個printf再編譯一遍,另一種是一直二分...