资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi。
小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少?
输入格式
输入的第一行包含两个整数n, p, t,表示走廊的长度,小明每次跳跃的最长距离和小明跳的次数。
接下来n个整数,表示走廊每个位置的权值。
输出格式
输出一个整数。表示小明跳过的方格的权值和的最大值。
样例输入
8 5 3
3 4 -1 -100 1 8 7 6
样例输出
12
数据规模和约定
1<=n, p, t<=1000, -1000<=wi<=1000
注意!!走廊的一端,是在第一个方格左边、最后一个方格右边
/**
* @param args
*/
static int Maxt[][];
static int p;
static int s[];
static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
int t;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
p=sc.nextInt();
t=sc.nextInt();
s=new int[n+1];
s[0]=0;
for(int i=1;i<=n;i++)
s[i]=sc.nextInt();
Maxt=new int[n+2][n+2];
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
Maxt[i][j]=-10000;
System.out.println(maxt(0,t));
}
public static int maxt(int i,int j){
if(Maxt[i][j]!=-10000)
return Maxt[i][j];
if(n-i+1>j*p || n-i+1<j) //跳不过去 或者 步数超过了距离
return -10000000;
if(j==1) //终止条件
return s[i];
int max=maxt(i+1,j-1);
for(int k=1;k<=p && i+k<=n;k++)
if(maxt(i+k,j-1)>max)
max=maxt(i+k,j-1);
Maxt[i][j]=s[i]+max;
return Maxt[i][j];
}
`