题目1
求数组中连续几个数的最大值。
动态规划方法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int [] array=new int [n];
for(int i=0;i<n;i++){
array[i]=sc.nextInt();
}
int [] dp=new int [n];//dp[i]表示以数组array中下标为i结尾的子串的最大和
dp[0]=array[0];
int max=array[0];
for(int i=1;i<n;i++){
dp[i]=Math.max(dp[i-1]+array[i], array[i]);
max=Math.max(max, dp[i]);
}
max=Math.max(max,0);
System.out.println(max);
}
}
题目2
求首尾相连数组的最大子数组和
分两种情况: 1. 当子数组“不跨越”母数组的时候: 用常规求最大子串和的方法,求出一个最优值。 2. 当子数组“跨越”母数组的时候: 要求该“跨越子数组”的最大子串和,则需在母数组中寻找一个“不跨越”的最小子串和,然后用总和减去该 值,即可。 上面两种情况取到的最大值与0比较,取大输出即可。
动态规划方法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int [] array=new int [n];
int sum=0;
for(int i=0;i<n;i++){
array[i]=sc.nextInt();
sum+=array[i];
}
int [] dpmax=new int [n];//dp[i]表示以数组array中下标为i结尾的子串的最大和
int [] dpmin=new int [n];//dp[i]表示以数组array中下标为i结尾的子串的最小和
dpmax[0]=array[0];
dpmin[0]=array[0];
int max=array[0];
int min=array[0];
for(int i=1;i<n;i++){
dpmax[i]=Math.max(dpmax[i-1]+array[i], array[i]);
max=Math.max(max, dpmax[i]);
dpmin[i]=Math.min(dpmin[i-1]+array[i],array[i]);
min=Math.min(min, dpmin[i]);
}
max=Math.max(max, sum-min);
max=Math.max(max, 0);
System.out.println(max);
}
}
转载自http://zhangpeizhen.blog.163.com/blog/static/231873112201431784024921/