题目:求一个序列中k个长度为m的不重复子序列相加的最大和
选取dp[i][j]表示在[j,n]范围内选了i个子序列的最大和,转移方程为dp[i][j]=max(dp[i-1][j+m] + sum[j+m-1] - sum[j-1], dp[i][j+1]),表示是否选[j, j+m-1]这段作为子序列之一
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt(), m = in.nextInt(), k = in.nextInt();
long[] a = new long[n+1];
long[] sum = new long[n+1];
long[][] dp = new long[k+1][n+1];
for (int i = 1; i <= n; i++)
a[i] = in.nextInt();
for (int i = 1; i <= n; i++)
sum[i] = a[i]+sum[i-1];
for (int i = 1; i <= k; i++) {
dp[i][n-i*m+1] = sum[n] - sum[n-i*m];
for (int j = n-i*m; j > 0; j--) {
dp[i][j] = Math.max(dp[i-1][j+m]+sum[j+m-1]-sum[j-1], dp[i][j+1]);
}
}
long res = 0;
for (int i = 1; i <= n-k*m+1; i++)
res = Math.max(res, dp[k][i]);
System.out.println(res);
}
}
}