你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如(i,i+1,...,i+k)的序列。 編號為 i 的士兵的初始戰鬥力為 xi ,一支特別行動隊的初始戰鬥力 x 為隊內 士兵初始戰鬥力之和,即x=xi+xi+1+...+xi+k。
通過長期的觀察,你總結出一支特別行動隊的初始戰鬥力 x 將按如下經驗公 式修正為 x′=ax2+bx+c,其中 a, b, c 是已知的係數(a < 0)。 作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊修正後 戰鬥力之和最大。試求出這個最大和。
例如,你有 4 名士兵,x1=2,x2=2,x3=3,x4=4。 經驗公式中的引數為 a = –1, b = 10, c = –20。此時,最佳方案是將士兵組成 3 個特別行動隊:第一隊包含士兵 1 和士兵 2,第二隊包含士兵 3,第三隊包含士兵 4。特別行動隊的初始戰鬥力分 別為 4, 3, 4,修正後的戰鬥力分別為 4, 1, 4。修正後的戰鬥力和為 9,沒有其它 方案能使修正後的戰鬥力和更大。
首先能看出是dp,然後可以發現這是斜率優化dp中較簡單的那一種。
dp方程:f[ i ] = max( f[j] + a*(s[ i ] - s[ j ])^2 + b * (s[ i ] - s[ j ]) + c);
轉一下斜率就好了。
**:
#include#includeusing
namespace
std;
#define n 1005000
#define ll long long
intn;
ll a,b,c,s[n],f[n];
ll x(
inti)
ll y(
inti)
ll k(
inti)
intq[n],h,t;
intmain()
for(int i=1;i<=n;i++)
printf(
"%lld\n
",f[n]);
return0;
}
APIO2010 特別行動隊
你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如 i,i 1,i k i,i 1,i k 的序列。編號為 i 的士兵的初始戰鬥力為 xi 一支特別行動隊的初始戰鬥力 x 為隊內 ...
APIO2010 特別行動隊
dp方程 dp i max dp i dp j a sum i sum j 2 b sum i sum j c 暴力還是可以過一些點的 不止20pts 甚至有人說他暴力水過去了。我們現在考慮正解,正解還是斜率優化。維護乙個上凸包qwqwq 設 dp i 表示到士兵i所能達到的最大戰力,sum i 表...
APIO2010 特別行動隊
2017 09 10 你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如 i,i 1,i k i,i 1,i k 的序列。編號為 i 的士兵的初始戰鬥力為 xi 一支特別行動隊的初...