第一层循环遍历段数,第二层循环遍历序列,sum记录连续子段和
核心代码:
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j - a[i]] + sum[j] - sum[j - a[i]]);
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer ;
import java.io.IOException ;
public class Main {
private static int[] a ;
private static int[] sum ;
private static int[][] dp ;
public static void main(String arg[])throws IOException{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))) ;
while(in.nextToken()!=StreamTokenizer.TT_EOF) {
int n = (int) in.nval;
if (n == 0) break;
in.nextToken();
int m = (int) in.nval;
a = new int[m+2];
for (int i = 1; i <= m; i++) {
in.nextToken();
a[i] = (int) in.nval;
}
sum = new int[n + 2];
for (int i = 1; i <= n; i++) {
in.nextToken();
sum[i] = sum[i - 1] + (int) in.nval;
}
dp = new int[m + 2][n + 2];
for (int i = 1; i <= m; i++) {
for (int j = a[i]; j <= n; j++) {
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j - a[i]] + sum[j] - sum[j - a[i]]);
}
}
System.out.println(dp[m][n]) ;
}
}
}