daimayuan 709. 最大权值划分
题意:
子段的权值为极差。把给定数组划分成任意个子段,求所有子段权值和的最大值。
思路:
每一段都是单调的,但是相邻的单调数不一定都在同一段
\(f(i,0/1)\) 表示 \(a_i\) 在一个下降/上升段中。然后讨论就完事了
若 \(a_i>a_{i-1}\):
\(f(i,0)=\max \{f(i-1,0),f(i-1,1)\}\)
\(f(i,1)=\max\{f(i-1,0),f(i-1,1)+a_i-a_{i-1}\}\)
若 \(a_i<a_{i-1}\):
\(f(i,0)=\max \{f(i-1,0)+a_{i-1}-a_i,f(i-1,1)\}\)
\(f(i,1)=\max\{f(i-1,0),f(i-1,1)\}\)
for(int i = 2; i <= n; i++) { //i=1是0,要从2开始
if(a[i] > a[i-1])
f[i][0] = max(f[i-1][0], f[i-1][1]),
f[i][1] = max(f[i-1][0], f[i-1][1]+a[i]-a[i-1]);
else
f[i][0] = max(f[i-1][0]+a[i-1]-a[i], f[i-1][1]),
f[i][1] = max(f[i-1][0], f[i-1][1]);
}
cout << max(f[n][0], f[n][1]);

浙公网安备 33010602011771号