动态规划题目关键是确定状态,然后建立转移方程
package ADV;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
/**
* AC
* 第二点五个不高兴的小明 dp
* http://lx.lanqiao.cn/problem.page?gpid=T770
*
*/
public class ADV369 {
static String[] s;
static int n,p,t;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
s = in.readLine().split(" ");
n = Integer.valueOf(s[0]);p = Integer.valueOf(s[1]);t = Integer.valueOf(s[2]);
s = in.readLine().split(" ");
int[] arr = new int[n+2];//存走廊的权值
for (int i = 0; i < s.length; i++) {
arr[i+1] = Integer.valueOf(s[i]);
}
arr[n+1] = 0;//终点权值设为0
dp = new int[t+1][n+2];//dp[i][j]:当前在第j个格子,跳了i次,一开始是dp[0][0],求dp[t][n+1]
//转移方程dp[i][j] = Max{dp[i-1][j-n]+arr[j]} 0<n<=p
//dp矩阵初始化为负无穷,使得从非起点转移的都是负无穷
for (int i = 0; i < dp.length; i++) {
Arrays.fill(dp[i], -0x3f3f3f3f);
}
dp[0][0] = 0;
for (int i = 1; i <= t; i++) {
for (int j = 1; j <= n+1 ; j++) {
for (int n = 1; n <= p; n++) {
if(j-n>=0)
dp[i][j] = Math.max(dp[i][j], dp[i-1][j-n]+arr[j]);
}
}
}
System.out.println(dp[t][n+1]);
}
}