In this challenge, you will be given an array and must determine an array . There is a special rule: For all , . That is, can be any number you choose such that . Your task is to select a series of given such that the sum of the absolute difference of consecutive pairs of is maximized. This will be the array's cost, and will be represented by the variable below.
The equation can be written:
For example, if the array , we know that , , and . Arrays meeting those guidelines are:
[1,1,1], [1,1,2], [1,1,3]
[1,2,1], [1,2,2], [1,2,3]
Our calculations for the arrays are as follows:
|1-1| + |1-1| = 0 |1-1| + |2-1| = 1 |2-1| + |3-1| = 3
|2-1| + |1-2| = 2 |2-1| + |2-2| = 1 |2-1| + |3-2| = 2
The maximum value obtained is .
Input Format
The first line contains the integer , the number of test cases.
Each of the next pairs of lines is a test case where:
- The first line contains an integer , the length of
- The next line contains space-separated integers
Constraints
Output Format
For each test case, print the maximum sum on a separate line.
Sample Input
1
5
10 1 10 1 10
Sample Output
36
Explanation
The maximum sum occurs when A[1]=A[3]=A[5]=10 and A[2]=A[4]=1. That is .
题意:
- 数组A包含元素A1,A2...AN。 数组_B包含元素B1,B2...BN. 元素Ai和Bi, &对所有; 1 ≤ i ≤ N, i.e., 任何元素Ai 在 1 和 Bi之间。令数组A的代价定义如下:为|A[i]-A[i-1]|之和。 请你计算最大可能的代价 S.
解析:求一序列相邻元素的差值绝对值之和,给定每个数的范围,要求最好和最大。那么很容易想到要使得相邻数相差最大,即相邻的分别取最大值和最小值,这样相邻的差值绝对的最大的。
但并不一定相邻的必定不能同时取最大值,如样例5 1 2 10。
定义dp[i][j],i>0&&i<=n,j={0,1},dp[i][0]表示第i位元素取最小值,dp[i][1]表示第I元素取最大值。转移方程为:
dp[i][1] = max(dp[i-1][0]+abs(cu[i]-1),dp[i-1][1]+abs(cu[i]-cu[i-1]));
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+abs(cu[i-1]-1));
代码如下:
#include <bits/stdc++.h>
using namespace std;
vector<string> split_string(string);
// Complete the cost function below.
int cost(vector<int> B) {
int dp[100005][2];
int n = B.size();
memset(dp,0,sizeof(dp));
for(int i=1;i<n;i++){
dp[i][1] = max(dp[i-1][0]+abs(B[i]-1),dp[i-1][1]+abs(B[i]-B[i-1]));
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+abs(B[i-1]-1));
}
int ans = max(dp[n-1][1],dp[n-1][0]);
return ans;
}
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
int t;
cin >> t;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for (int t_itr = 0; t_itr < t; t_itr++) {
int n;
cin >> n;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
string B_temp_temp;
getline(cin, B_temp_temp);
vector<string> B_temp = split_string(B_temp_temp);
vector<int> B(n);
for (int B_itr = 0; B_itr < n; B_itr++) {
int B_item = stoi(B_temp[B_itr]);
B[B_itr] = B_item;
}
int result = cost(B);
fout << result << "\n";
}
fout.close();
return 0;
}
vector<string> split_string(string input_string) {
string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) {
return x == y and x == ' ';
});
input_string.erase(new_end, input_string.end());
while (input_string[input_string.length() - 1] == ' ') {
input_string.pop_back();
}
vector<string> splits;
char delimiter = ' ';
size_t i = 0;
size_t pos = input_string.find(delimiter);
while (pos != string::npos) {
splits.push_back(input_string.substr(i, pos - i));
i = pos + 1;
pos = input_string.find(delimiter, i);
}
splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));
return splits;
}