题目链接: [Frog]
大致题意:
有一只青蛙,有n个节点,开始时在1节点,有k次往右跳的机会,每次跳的距离是a-b之间
每个节点有一个值,到达那个节点则总值加上那个值
求最大能得到的值
解题思路:
dp[i][j]表示走i步到达j位置能得到的最大值
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int s[200];
int dp[200][200];
int main(void)
{
int t; scanf("%d", &t);
while (t--) {
int n, a, b, k; cin >> n >> a >> b >> k;
for (int i = 1; i <= n; ++i)cin >> s[i];
memset(dp, -1, sizeof dp); dp[1][0] = s[1];
for (int i = 1; i <= n; ++i) {
for (int j = a; j <= b; ++j) {
for (int p = 0; p <= k; ++p) {
if (dp[i][p]!=-1 && i + j <= n)dp[i + j][p + 1] = max(dp[i + j][p + 1], dp[i][p] + s[i + j]);
}
}
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1;j <= k; ++j) {
ans = max(dp[i][j], ans);
}
}
cout << ans << endl;
}
return 0;
}