\(part1:\)
首先看到題目,嗯~ o( ̄▽ ̄)o很騷
手玩一波樣例之後發現狀態很好想(這裡簡單地任務階段可以被劃分次數(也就是劃分順序)和劃分位置來劃分),初步想法是\(f[i][j]\)表示前\(i\)次最後一次切的是\(j\)位置
隨後意識到沒法通過上一層進行轉移,這裡出現問題也是正常,因為沒有進行更深入地發掘性質
此處無法轉移的原因是切的順序不知道,真讓人頭大
\(part2:\)
觀察到題目中計算分數的方法很騷,和的乘積
這兩種運算都比較特殊,都有交換律
然後發現答案與切的順序無關
\(part1\)中的問題迎刃而解,修正狀態得:\(f[i][j]\)表示前\(i\)給數分成\(j\)段的最大值
\(part3:\)
開始轉移
\(f[i][j]=min\\)
\(s[i]\)時字首和
複雜度:\(o(n^2*k)\)
得分:\(50\)
注意此**中\(i\)和\(j\)的含義和上面反著,抱歉
#include#define int long long int
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return f*s;
}const int n=2020;
int road[n][250],n,k,f[n][250],sum[n],a[n];
signed main()
}} }
cout<=1;--i)
return 0;
}
P3648 APIO2014 序列分割
傳送門 首先容易證明,得分和切的順序沒有關係 所以直接預設先切左邊再切右邊就好了 然後顯然可以 dp 一開始想的是設 f i j 表示切了 i 次,此次把 j 和 j 1 分開,得到的最大價值 那麼顯然列舉上一次切的位置 k 那麼 f i j f i 1 k sum j sum k sum n su...
P3648 APIO2014 序列分割 斜率優化
好的先把自己的式子推了出來 樸素 定義 f i j 表示前 i 個數進行 j 次切割的最大得分,s i 為字首和 那麼轉移方程為 f i j max f i 1 j s j s i s j 優化一下 省掉第一維 f i max mem j s j s i s j f j mem j 相當於 f i ...
Luogu 3648 APIO2014 序列分割
題目鏈結 首先要發現乙個重要的性質 分割的順序是不會影響答案的 證明 首先對於沒有交的兩段區間,顯然先後順序改變不會有影響 而對於在同一段區間上的兩次分割 設有一段序列由長度為 x,y,z 的三段拼接起來 如果先分割 xy 和 z 再分割 x 和 y 答案是 x y z x y 而如果先分割 x 和...