这道题是一个DP题,先建一个dp数组f。初始化第一个位置为a[1]。插一句嘴,我喜欢用洛谷,所以不会DP的就上学一下。
这个题没有坑,是比较简单的。会了dp后理解这个方程式就简单多了
f[i] = max(f[i],f[i - j] + a[i]);
怎么做呢?想吧!
#include <bits/stdc++.h>
using namespace std;
int n,s,t,a[1001],f[1001];
int main(){
cin >> n;
cin >> s >> t;
for (int i = 1;i <= n;i++) cin >> a[i];
f[1] = a[1];
f[n] = 0;
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]);
if (a[n] == f[n]){
cout << 0 << "\n";
return 0;
}
cout << f[n];
return 0;
}
代码,看懂了吗,看懂就对了。没看懂就在看看dp。
两个循环摆的很明白,外层模拟dp,内层看跳多少步,判断超不超。
第一天比较简单,以后带大家了解更多好题