求最大M子段,,又是典型的动态规划例题,做起来的第一感觉就是跟前两道题有点不一样。。
状态变量:
dp[m][n]表示要取m段,并且最后一段包括a[n-1] 的最大子段和
状态转移方程:
dp[i][j] = dp[i][j - 1] + a[j - 1]; //a[j-1] 直接加入到第i段中
for(int t=i-1;t<j;t++)
dp[i][j] = Math.max(dp[i][j], dp[i - 1][t] + a[j - 1]); //a[j-1] 重新定义一段,并且遍历前一段的任何位置,取最大的状态量
import java.util.Scanner;
/**
*
* @author Administrator
*/
public class Mmax {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int part = scan.nextInt();
int num = scan.nextInt();
int[] a = new int[num];
int[][] dp = new int[part + 1][num + 1]; //dp[m][n]取m段,并且最后一段包括a[n-1]
for (int i = 0; i < num; i++) {
a[i] = scan.nextInt();
}
for (int i = 1; i <= part; i++) {
for (int j = i; j <= num; j++) {
dp[i][j] = dp[i][j - 1] + a[j - 1]; //直接加入到第i段中
for (int t = i-1; t < j; t++) { //重新定义一段,并且遍历前一段的任何位置,取最大的状态量
dp[i][j] = Math.max(dp[i][j], dp[i - 1][t] + a[j - 1]);
}
}
}
int max = Integer.MIN_VALUE;
for (int i = part; i <= num; i++) {
if (max < dp[part][i]) {
max = dp[part][i];
}
}
System.out.println(max);
}
}
}