抢金块

输入文件:gold.in

输出文件:gold.out

问题描述:

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

输入格式:

第一行是格子个数,

第二行是S和T ,保证T大于S。

第三行是每个格子上的金块价值.。第一个为第一个格子上的价值,默认从第一个格子起跳,必须跳到最后一个格子上,也就是说第一个格子上的金块和最后一个格子的金块你就可以直接获得了。

输出格式:

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

输入

10

2 3

4 5 8 2 8 3 6 7 2 9

输出

36

数据规模

格子数目<1000

2<=S小于T<=10

每个金块的价值<10000

【解题思路】

一看此题就是很简单的dp,每一个格子的价值,就是前面第t个到前面第s个价值的最大值加上当前的格子价值。

【参考程序】

#include<iostream>
#include<cstdio>
using namespace std;
int n,s,t,a[1001],f[1001];
int main()
{
freopen("gold.in","r",stdin);
freopen("gold.out","w",stdout);
cin>>n;
cin>>s>>t;
for (int i=1;i<=n;i++) cin>>a[i];
f[1]=a[1];
for (int i=2;i<=n;i++)
{
for (int j=s;j<=t;j++)
{
if (i-j>0) f[i]=max(f[i],f[i-j]+a[i]);
}
}
cout<<f[n];
return 0;
}
//太水了不写注释233333
05-13 17:06