题意:给出一个数组,取出若干数使得取出来的数按照相邻两数相加,接着变为相减,使得最后的结果最大
思路:建立一个DP的数组,
dp[i][0]记录最后一个数为负的最大值
dp[i][1]记录最后一个数为正的最大值
max(dp[i-1][0],dp[i-1][1]-arr[i])
max(dp[i-1][1],dp[i-1][0]+arr[i],arr[i])
AC代码:
package 练习;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
static long dp[][]=new long [300005][2];
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
int n=sc.nextInt();
for(int i=0;i<n;i++) {
show();
}
}
private static void show() {
int n=sc.nextInt();
int q=sc.nextInt();
long arr[]=new long [n];
for(int i=0;i<n;i++) {
arr[i]=sc.nextLong();
}
dp[0][0]=0;
dp[0][1]=arr[0];
for(int i=1;i<n;i++) {
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-arr[i]);
dp[i][1]=Math.max(dp[i-1][1], Math.max(dp[i-1][0]+arr[i],arr[i]));
}
System.out.println(Math.max(dp[n-1][1], dp[n-1][0]));
}
}