【动态规划】抢金块
问题 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。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }