(題目鏈結)
給出乙個序列,將序列分成連續的幾段,每段的價值為a*s*s+b*s+c,其中a,b,c為給定常數,s為這一段中所有數之和。求最大價值和。
斜率優化。
dp方程:$$$$
其中$$為字首和,$$表示從1~i的最大價值。
斜率式:$$$$
所以決策$$對映到平面直角座標系上就是:$$。斜率:$$為正且單增;橫座標$$單減($$小於0,$$單增),所以單調佇列裡面的點長成這樣:
開long long。
// bzoj1911#include#include#include#include#include#include#define ll long long
#define inf 1e18
#define pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
const int maxn=1000010;
ll f[maxn],s[maxn],a,b,c;
int n,q[maxn];
double slope(int i,int j)
int main()
printf("%lld",f[n]);
return 0;
}
BZOJ 1911 APIO2010 特別行動隊
題目描述 因為是從別人部落格裡斜率優化分類一欄找的題目,所以 這題被我秒了。顯然先預處理字首和s i ik 1 xi 設 d i 為將前i 個士兵分組的最大修正後戰鬥力。d i max maxm ax a s i 2 b s i c設 kixj biyj 2a s i s j d i a s i 2...
BZOJ1911 Apio2010 特別行動隊
有n個人,每個人都有乙個戰力值,將這n個人分成若干個段 每個段內的人的編號都是連續的 每個段的初始戰力值為每個段內的人的戰力值的總和 給出常數a,b,c,而每個段的真正戰力值為ax2 bx c x為這個段的初始戰力值 求出分成若干個段得到的所有段的最大真正戰力值總和 dp很容易想到 設f i 為將前...
bzoj 1911斜率優化
這個題為什麼有個 關於斜率優化又有了新的感悟 對於次優解的排除 假設對於i來說l是次優解。即滿足k q l q l 1 k i 時,l 1比l更優 k q l q l 1 表示這兩個點連成一條線的斜率,k i 表示在i處那根線的斜率,這個很容易就可以證明 對於提前排除不可能的解 假設r是考慮排除的點...