方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有 \(n\) 株,它們的高度參差不齊。
方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高 \(1\) 單位高度,他可以進行最多 \(k\) 次這樣的操作。拔玉公尺則可以隨意選擇乙個集合的玉公尺拔掉。
問能最多剩多少株玉公尺,來構成一排美麗的玉公尺。
第一行包含兩個整數 \(n\),\(k\),分別表示這排玉公尺的數目以及最多可進行多少次操作。
第二行包含 \(n\) 個整數,第 \(i\) 個數表示這排玉公尺,從左到右第 \(i\) 株玉公尺的高度 \(a_i\)。
輸出乙個整數,最多剩下的玉公尺數。
有乙個顯而易見的貪心:即每次都是拔高以 \(n\) 結尾的一段區間是最優的
如果拔高了區間 \([i,j]\),其中 \(j,那麼換成拔高 \([i,n]\) 一定不會讓答案變得更劣
所以現在的問題就變成每次選擇一段字尾上的玉公尺進行拔高
設 \(dp[i][j]\) 表示第 \(i\) 株玉公尺總計被拔高了 \(j\) 次時,以第 \(i\) 株玉公尺結尾的最長不降子串行的長度(這個子狀態有億點點難想到)
轉移方程:\(dp[i][j]=\max(dp[k][l])+1\),其中 \(k
那這個max怎麼快速求得呢?似乎要用樹套樹 不過這題由於空間夠用,所以樹狀陣列套樹狀陣列就行了
答案就是整個dp陣列中的最大值
#include #define n 10005
#define lowbit(x) x&(-x)
using namespace std;
template inline void read(t &num)
int n, k, a[n], dp[n][505];
int tr[n][505], ans;
void update(int x, int y, int v) }}
int query(int x, int y)
} return ret;
}int main()
for (int i = 1; i <= n; i++)
} printf("%d\n", ans);
return 0;
}
方伯伯的玉公尺田 SCOI2014
方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度...
SCOI2014 方伯伯的玉公尺田
題目 首先乙個很顯然的事實,我們所有操作的區間的右端點都是 n 即我們操作的區間是一些字尾 這個很好理解啊,我們使得乙個區間整體增加是為了盡可能和前面的點形成不降子串行,並沒有必要僅提公升一段區間的高度使得這一段難以和後面的接上,所以直接操作到 n 一定是最優的。設 dp 表示前 i 個字尾操作共操...
SCOI2014 方伯伯的玉公尺田
方伯伯在自己的農田邊散步,他突然發現田裡的一排玉公尺非常的不美。這排玉公尺一共有n株,它們的高度參差不齊。方伯伯認為單調不下降序列很美,所以他決定先把一些玉公尺拔高,再把破壞美感的玉公尺拔除掉,使得剩下的玉公尺的高度構成乙個單調不下降序列。方伯伯可以選擇乙個區間,把這個區間的玉公尺全部拔高1單位高度...