日常貼一波題面。。。
time limit: 60 sec memory limit: 128 mb這題首先應該能看出是個$dp$來。。。submit: 1413 solved: 637
[submit][status][discuss]
方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。
這排玉公尺一共有n株,它們的高度參差不齊。
方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。
方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度,他可以進行最多k次這樣的操作。拔玉公尺則可以隨意選擇乙個集合的玉公尺拔掉。
問能最多剩多少株玉公尺,來構成一排美麗的玉公尺。
第1行包含2個整數n,k,分別表示這排玉公尺的數目以及最多可進行多少次操作。
第2行包含n個整數,第i個數表示這排玉公尺,從左到右第i株玉公尺的高度ai。
輸出1個整數,最多剩下的玉公尺數。
3 12 1 3
31 < n < 10000,1 < k ≤ 500,1 ≤ ai ≤5000
然後因為最後會把所有不符合$lnds$的玉公尺都拔掉所以這題相當於是在使用$k$次許可權(大霧)後lnds的最長長度
分析之後可以發現形如$[i,n]$的操作是最優策略,因為這樣操作後可以對$i$之前的資料產生影響,而如果右端點不是n的話可能會減少$lnds$的長度
然後我們定義$f_$為使用了$i$次許可權,最後一位高度為$j$時最大的$lnds$長度,然後我們可以發現可以使用樹狀陣列優化dp
總時間複雜度$o(nlogn*klogk)$
以及注意一下邊界處理因為$i$可以等於0所以查詢與修改時最好都使用$i+1$而且$i$要倒序列舉(參考0/1揹包理解)
袋馬時間
github
1 #include 2 #include 3 #include 4 #include 5 #include 6view code7const
int maxn=10010;8
const
int maxk=510;9
const
int maxh=5010;10
11int
n;12
intk;
13int
data[maxn];
14int bit[maxk][maxk+maxh];
1516
void
initialize();
17void add(int,int,int
);18
int query(int,int
);19
int lowbit(int
);20
intdynamicprogramming();
2122
intmain()
2728
intdynamicprogramming()38}
39return
ans;40}
4142
void
initialize()47}
4849 inline void add(int i,int j,int
d)54}55
}5657 inline int query(int i,int
j)63}64
return
ans;65}
6667 inline int lowbit(int
x)
圖包時間
bzoj 3594 方伯伯的玉公尺田
開始覺得自己好不容易想出一道題,後來發現自己是錯的。用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...
方伯伯的玉公尺田
例題 方伯伯的玉公尺田 一位大佬的鏈結 有關二維樹狀陣列 關於我做這道題的心路歷程 1.我在某個晚上準備練習dp題,看到方伯伯的玉公尺田這 道題,難度適宜,知識簡單,準備做一做。乙個晚上過去 了,我除了推出了他每一次會抬高最右邊的玉公尺外,還推 出了一大堆錯誤結論,例如一定會從已有的上公升序列中的 ...
SCOI2014 方伯伯的玉公尺田
題目 首先乙個很顯然的事實,我們所有操作的區間的右端點都是 n 即我們操作的區間是一些字尾 這個很好理解啊,我們使得乙個區間整體增加是為了盡可能和前面的點形成不降子串行,並沒有必要僅提公升一段區間的高度使得這一段難以和後面的接上,所以直接操作到 n 一定是最優的。設 dp 表示前 i 個字尾操作共操...