例題:方伯伯的玉公尺田
一位大佬的鏈結(有關二維樹狀陣列)
關於我做這道題的心路歷程:
1.我在某個晚上準備練習dp題,看到方伯伯的玉公尺田這
道題,難度適宜,知識簡單,準備做一做。乙個晚上過去
了,我除了推出了他每一次會抬高最右邊的玉公尺外,還推
出了一大堆錯誤結論,例如一定會從已有的上公升序列中的
左端點抬高啦。甚至還想,這不會是貪心題吧.
2.第二個晚上,我搞出了一大堆dp方程,就剩最後怎麼
處理高度的問題。結果這個狀態轉移怎麼也想不出。最後
看題解,發現越看越糊塗,無聊之中點開了乙個題解的鏈
接。這是我轉機的開始(要是沒點開,可能我一輩子都做
不出)首先我發現他的題解寫錯了 然後我發現我把題看錯了。
不少大佬的題解都一開始說明f[i][j]指的是第i個點被覆蓋j次的最大不下降序列。這其實就是這道題的列舉思路,然而並不需要寫在**中(ps.很多題都是這樣),這也就要是說,dp方程與他無關。
這就會有疑問:為什麼無關?
還記得揹包優化嗎?
滾動陣列使得一維消失了,因而從dp方程看上去,與列舉到哪乙個物品無關。本題同樣如此。這也使得在列舉剩餘維度是一定要注重順序。
接下來,將用到性質一:每次考慮抬高一段區間,我們都視這段區間的右端點為n
證明:
考慮從 l 開始抬高,當我們抬高到r,會對原有的上公升子串行有兩個影響
1. 1-l的序列中的每乙個數,它右邊比它大的數與抬
高前相比,有增多的趨勢。我們稱這對產生最長不下降子串行
有有利影響
2. r-n的每乙個數,他前邊比它小的數有減少趨勢。我們
稱這對產生最長不下降子串行有不利影響。
這就可以發現,我們把r定為n時,沒有不利影響。
這就相當於,我們到乙個點,就可以列舉它被抬高了幾次。我們把區間的抬高轉化為了點的抬高。
性質2:當前列舉到的點i,在它為j次抬高時,以他為終點的不下降子串行由前邊任意乙個比它抬高後矮的點x+1取max得來
這個看上去容易得到,其實把這個想通了,這道題做了一半。
首先,在實際寫法中,需測判這個點x抬高次數是否小於j;
否則對於這樣一組資料 4 1 2 1 4 3會出錯。
實際上有了這兩個性質後,我們就可以初步列出方程f[
i][j
][k]
=maxp=
1i−1
f[p]
[j′]
[k′]
(j′+
k′k,k′
f [i
][j]
[k]=
maxp=1
i−1f
[p][
j′][
k′](
j′+k
′ k,k′ 可以看出這是乙個三維轉移方程,然而,我們發現 1. 我們大的高度總是由小的高度推出 1. 我們不關注每個位置具體的情況,我們只要求得最終答案即可。 介於上述兩點,我們可以考慮降維。但我們從大的高度列舉到小的高度時,因為對每個位置的列舉是有序,先列舉的大高度又不會影響後列舉的小高度。 轉移方程即為下述 f[ j][k ]=maxj′+ k′kf[j ′][k ′](k ′f [j ][k] =maxj′ +k ′ kf[j ′][k ′](k ′ 做到這裡,已有了乙個欠優的**,考慮求max,可用二維樹狀陣列優化後,降到(l og2n )2( lo g2n) 2關於二維樹狀陣列,前面的大佬鏈結有詳細的解釋,也可以看我的另一篇部落格。我們可以模擬一維。一維樹狀陣列可以讓我們在lo g2n log 2n 的時間進行修改與查詢線狀的一條字首和,二維樹狀陣列能讓我們在(l og2n )2( lo g2n) 2內進行乙個矩形面積的查詢。 #define ll long long #define rg register #define il inline #define maxn 10000 using namespace std; il int read() return data; }il int lowbit(int k) int n,k,mh; int btree[maxn][maxn],h[maxn]; void fix(rg int ii,rg int jj,rg int x) int query(rg int ii,rg int jj) int main() rg int ans=0; for(rg int i=1;i<=n;++i) }printf("%d",ans); } 方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度... 方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有 n 株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高 1 ... 開始覺得自己好不容易想出一道題,後來發現自己是錯的。用f i j 表示前i個玉公尺,發動j次技能最多能留下的玉公尺數。但是這個東西可以由j 1 i 1中任意乙個數轉移來,所以用樹狀陣列優化dp f i j f p q 1 p p q include include include include i...#include
方伯伯的玉公尺田 SCOI2014
方伯伯的玉公尺田 SCOI2014
bzoj 3594 方伯伯的玉公尺田