有一条长为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。
思路:
本题需要选择一步的距离,在规定步数下,求最优解,所以有两种解法,DFS(记忆化) 和 DP。
DFS+记忆化
数据说明:
maxn是数据范围, INF是最大值 (个人习惯)
n:一共多少个点 p:最远一步可以走多远 t:能走几步
w[i] :点权 dp[i][j] 从i点还剩j步的最大值
index就是i step就是j
Code:
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll INF = 0x7f;
const ll maxn = 1005; //数据范围
ll n,p,t;
ll w[maxn];
ll dp[maxn][maxn];
ll dfs(ll index,ll step){
if(dp[index][step]!= -1)return dp[index][step]; //剪枝
if(step*p < n-index+1)return -INF