序列分割 Apio2014

2022-05-01 03:51:09 字數 1891 閱讀 2140

time limit: 40 sec  memory limit: 128 mb

submit: 4036  solved: 1574

[submit][status][discuss]

小h最近迷上了乙個分隔序列的遊戲。在這個遊戲裡,小h需要將乙個長度為n的非負整數序列分割成k+1個非空的子串行。為了得到k+1個子序列,小h需要重複k次以下的步驟:

1.小h首先選擇乙個長度超過1的序列(一開始小h只有乙個長度為n的序列——也就是一開始得到的整個序列);

2.選擇乙個位置,並通過這個位置將這個序列分割成連續的兩個非空的新序列。

每次進行上述步驟之後,小h將會得到一定的分數。這個分數為兩個新序列中元素和的乘積。小h希望選擇一種最佳的分割方式,使得k輪之後,小h的總得分最大。

輸入第一行包含兩個整數n,k(k+1≤n)。

第二行包含n個非負整數a1,a2,...,an(0≤ai≤10^4),表示一開始小h得到的序列。

輸出第一行包含乙個整數,為小h可以得到的最大分數。

7 3

4 1 3 4 0 2 3

108

【樣例說明】 

在樣例中,小h可以通過如下3輪操作得到108分: 

1.-開始小h有乙個序列(4,1,3,4,0,2,3)。小h選擇在第1個數之後的位置 

將序列分成兩部分,並得到4×(1+3+4+0+2+3)=52分。 

2.這一輪開始時小h有兩個序列:(4),(1,3,4,0,2,3)。小h選擇在第3個數 

字之後的位置將第二個序列分成兩部分,並得到(1+3)×(4+0+2+ 

3)=36分。 

3.這一輪開始時小h有三個序列:(4),(1,3),(4,0,2,3)。小h選擇在第5個 

數字之後的位置將第三個序列分成兩部分,並得到(4+0)×(2+3)= 

20分。 

經過上述三輪操作,小h將會得到四個子串行:(4),(1,3),(4,0),(2,3)並總共得到52+36+20=108分。 

【資料規模與評分】 

:資料滿足2≤n≤100000,1≤k≤min(n -1,200)。

[submit][status][discuss]

首先,我們可以通過數學歸納法證明只要切割位置一定,順序不影響最終分數。

所以我們可以設f[i][k]表示前i個數切割k次獲得的最大分數。狀態轉移方程為f[i][k] = max,通過斜率優化+滾動陣列可以使時間和空間滿足要求。

1 #include2 #include3 #include4

#define ll long long

5#define ri register int

6using

namespace

std;

7const

int inf = 0x7fffffff;8

const

int n = 100000 + 10;9

const

int m = 200 + 10;10

11inline ll read()

19int n, k ; ll pre[n], f[n][2] ; int

q[n] ;

2021 inline ll sqr(ll x)

22 inline double y(int j,int k)

23 inline double x(int j)

24 inline double rate(int i,int j,int k1,int k2)

2526

intmain() 37}

38 printf("

%lld

",f[n][k&1

]) ;

39return0;

40 }

幾個易錯點:(其實就是我犯的錯誤啦qwq)

APIO 2014 序列分割

題目鏈結 演算法 首先 我們發現將一段序列切成若干段所獲得的收益與順序無關 於是我們可以用fi,j表示切i次 前j個數的最大收益 令sumi表示ai的字首和 顯然 fi,j max 斜率優化即可 此題記憶體限制較緊 可以使用滾動陣列優化空間複雜度 時間複雜度 o nk includeusing na...

APIO2014 序列分割

將乙個長度為 n 的序列分成 k 段,每次分割一段長度 ge 2 的序列,得分為兩邊序列元素和的乘積,求最大得分 2 leq n leq100000,1 leq k leq min 0 a i 10 4 我們發現一對元素 i,j 產生貢獻 a i a j 的條件是分割後元素不在同一段裡 於是我們知道...

APIO2014 序列分割

嘟嘟嘟 複習一下斜率優化,感覺已經忘得差不多了 這題切入點在與答案跟切的順序無關。證明就是假如有三段權值分別為 x,y,z 那麼這兩刀不管按什麼順序切,得到的結果都是 xy xz yz 然後就可以dp。令 dp i j 表示前 i 個數切 j 刀的最大得分,於是就有 dp i j max 觀察這個式...