问题描述
有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi。
小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少?
输入格式
输入的第一行包含两个整数n, p, t,表示走廊的长度,小明每次跳跃的最长距离和小明跳的次数。
接下来n个整数,表示走廊每个位置的权值。
输出格式
输出一个整数。表示小明跳过的方格的权值和的最大值。
样例输入
8 5 3
3 4 -1 -100 1 8 7 6
样例输出
12
解法 :
dp问题 根据前一态的最优解来推出n+1这个位置最优可能性
状态转移方程为 f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 1 ] [ j − k ] + g [ j ] ) f[i][j]=max(f[i][j],f[i-1][j-k]+g[j]) f[i][j]=max(f[i][j],f[i−1][j−k]+g[j]) 枚举每一次跳跃时他跳跃前一次的位置到这里的距离 k k k 然后加上 g [ j ] g[j] g[j]
代码
#include<iostream>
#include<cstring>
using namespace std;
int n,p,t;
const int N = 1111;
int g[N];
int f[N][N];
int main(){
cin>>n>>p>>t;
memset(f,-0x3f,sizeof f);
for(int i=1;i<=n;i++) {
cin>>g[i];
if(i<=p) f[1][i] = g[i];
}
for(int i=2;i<=t;i++){
for(int j=i;j<=n+1;j++){
for(int k=1;k<=p&&(j-k>0);k++){
f[i][j]=max(f[i][j],f[i-1][j-k]+g[j]);
}
}
}
cout<<f[t][n+1];
return 0;
}