【动态规划】抢金块

问题 E: 【动态规划】抢金块

时间限制: 1 Sec  内存限制: 64 MB
提交: 40  解决: 14
[提交] [状态] [讨论版] [命题人:]

题目描述

地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步(2≤S<T≤10)。例如S=2,T=4,你就可以跳2步、3步或4步。你从第一个格子起跳,必须跳到最后一个格子上,请你输出最多可以获得的金块的总价值。


输入

第1行是格子个数n (n<1000);
第2行是S和T,保证T大于s(2≤S<T≤10);
第3行是每个格子上的金块价值Pi (Pi<10000)。


输出

输出最多可以获得的金块的总价值。


样例输入

10
2 3
4 5 8 2 8 3 6 7 2 9

样例输出

36

提示

样例说明:跳l、3、5、8、10,总价值:4+8+8+7+9=36。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int n,s,t,val[1005],dp[1005];
void init(){
    cin>>n>>s>>t;
    range(i,1,n)cin>>val[i];
    dp[1]=val[1];
}
void solve(){
    range(i,2,n)
    range(j,s,t)if(i-j>0)dp[i]=max(dp[i],dp[i-j]+val[i]);
    cout<<dp[n]<<endl;
}
int main() {
    init();
    solve();
    return 0;
}
View Code

原文地址:https://www.cnblogs.com/Rhythm-/p/9350591.html