สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และเราสามารถย้อนกลับรายการย่อยในรายการได้ครั้งเดียว หลังจากดำเนินการนี้แล้ว เราต้องหาค่าสูงสุดที่เป็นไปได้ของ
$\displaystyle\sum\limits_{i=0}^{n-2}| nums[i+1]-[nums[i]|$
ดังนั้นหากอินพุตเป็น nums =[2, 4, 6] ผลลัพธ์จะเป็น 6 เช่นเดียวกับเมื่อเราย้อนกลับ [4, 6] เราจะได้รายการเป็น [2, 6, 4] และค่า | 2 − 6| + |6 − 4| =6
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้าขนาดของ nums <=1 แล้ว −
-
คืนค่า 0
-
-
ตอบ :=0
-
n :=ขนาดของ nums
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน
-
ans :=ans + |nums[i] − nums[i − 1]|
-
-
ต้นฉบับ :=ans
-
สำหรับการเริ่มต้น i :=1 เมื่อ i
-
ans :=สูงสุดของ ans และ orig − |(nums[i] − nums[i + 1]| + |nums[0] − nums[i + 1]|
-
ans :=สูงสุดของ ans และ orig − |(nums[i] − nums[i − 1]| + |nums[n − 1] − nums[i − 1]|
-
-
pp :=−|nums[1] − nums[0]|
-
pm :=−|nums[1] − nums[0]|
-
mp :=−|nums[1] − nums[0]|
-
มม. :=−|nums[1] − nums[0]|
-
สำหรับการเริ่มต้น j :=2 เมื่อ j
-
jerror :=|nums[j + 1] − nums[j]|
-
ans :=สูงสุดของ ans และ (orig + pp − jerror − nums[j] − nums[j + 1])
-
ans :=สูงสุดของ ans และ (orig + pm − jerror − nums[j] + nums[j + 1])
-
ans :=สูงสุดของ ans และ (orig + mp − jerror + nums[j] − nums[j + 1])
-
ans :=สูงสุดของ ans และ (orig + mm − jerror + nums[j] + nums[j + 1])
-
pp :=สูงสุดของ pp และ −|nums[j] − nums[j − 1]|
-
pm :=สูงสุดของ pm และ −|nums[j] − nums[j − 1]|
-
mp :=สูงสุดของ mp และ −|nums[j] − nums[j − 1]|
-
mm :=สูงสุดของ mm และ −|nums[j] − nums[j − 1]|
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int solve(vector<int>& nums) {
if (nums.size() <= 1)
return 0;
int ans = 0;
int n = nums.size();
for (int i = 1; i < n; i++) {
ans += abs(nums[i] − nums[i − 1]);
}
int orig = ans;
for (int i = 1; i < n − 1; i++) {
ans = max(ans, orig − abs(nums[i] − nums[i + 1]) +
abs(nums[0] − nums[i + 1]));
ans = max(ans, orig − abs(nums[i] − nums[i − 1]) + abs(nums[n
− 1] − nums[i − 1]));
}
int pp = −abs(nums[1] − nums[0]) + nums[0] + nums[1];
int pm = −abs(nums[1] − nums[0]) + nums[0] − nums[1];
int mp = −abs(nums[1] − nums[0]) − nums[0] + nums[1];
int mm = −abs(nums[1] − nums[0]) − nums[0] − nums[1];
for (int j = 2; j < n − 1; j++) {
int jerror = abs(nums[j + 1] − nums[j]);
ans = max(ans, orig + pp − jerror − nums[j] − nums[j + 1]);
ans = max(ans, orig + pm − jerror − nums[j] + nums[j + 1]);
ans = max(ans, orig + mp − jerror + nums[j] − nums[j + 1]);
ans = max(ans, orig + mm − jerror + nums[j] + nums[j + 1]);
pp = max(pp, −abs(nums[j] − nums[j − 1]) + nums[j − 1] +
nums[j]);
pm = max(pm, −abs(nums[j] − nums[j − 1]) + nums[j − 1] −
nums[j]);
mp = max(mp, −abs(nums[j] − nums[j − 1]) − nums[j − 1] +
nums[j]);
mm = max(mm, −abs(nums[j] − nums[j − 1]) − nums[j − 1] −
nums[j]);
}
return ans;
}
int main(){
vector<int> v = {2, 4, 6};
cout << solve(v);
} อินพุต
{2, 4, 6} ผลลัพธ์
6