想了半天終於是看的題解,網上的題解好像都是出自一人之手,寫的都一毛一樣,令人窒息。
建了乙個遞減的佇列,具體很難講的清,又不想複製別人的講解,就這樣吧。
#include#include#include#include#include#include#include#define ls 2*rt
#define rs 2*rt+1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define ll long long
using namespace std;
typedef pairpii;
const ll inf = 0x3f3f3f3f;
/*void dis(int a, int n)
if(ok)
p[0] = dp[0] = 0;
head = qu[0] = 0;
tail = 1;
pos = sum = 0;
for(int i = 1; i <= n; i++)
//sum -= p[qu[head++]];
while(tail >head && qu[head] < pos)
head++;
while(tail >head && p[i] >= p[qu[tail-1]])
tail--;
qu[tail++] = i;
dp[i] = dp[pos-1] + p[qu[head]];
for(int j = head; j < tail-1; j++)
dp[i] = min(dp[i],dp[qu[j]]+p[qu[j+1]]);
} cout
}
POJ3017 單調佇列
交的時候沒什麼信心會ac,結果ac了,挺高興的。如果之前能確定演算法沒問題,應該自信點 不熟練還是 題解 先得dp方程 f i f j max x j 1 x j 2 x i 其中j include include include using namespace std typedef int64 ...
poj 3017 單調佇列(附加multiset)
只能說是 美如畫。當然我是指內在邏輯不是我的 風格,隊長看到要理解哈,啊哈哈哈哈哈哈哈哈 正常思路咯,f i f j max a j 1 a j 2 a i 列舉j,顯然硬來會超時,所以需要有乙個單調佇列來時時把最大值盡快弄出來並且需要一些剪枝 剪枝條件有兩個,乙個是和不能超過m,乙個是顯然f i ...
POJ 3017 單調佇列 最值優化 的動態規劃
令f i 表示前i個數按照題目要求的最小的和 則必然有f i min f j max a j 1 a j 2 a i 其中j i,j的位置還得滿足題目中m 的限制 由於a陣列都是大於0的,所以可以發現f必然是非遞減的。設a j 1 a j 2 a i 中值最大的下標為k 設x為 j 1,k 的任意乙...