很经典的dp问题
对于求解动态规划类的问题,关键就是阶段,状态,决策,状态转移方程
本题的核心点就是,怎么找到上一个状态
dp[i] = max(dp[i -1],dp[i - k - 1] + a[i])
当前点不选,它的上一个状态就是i - 1
当前点如果选,它的上一个状态是i - k - 1
关键就是它对应的上一个状态是什么
// Problem: 小竹关禁闭
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/45670/C
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-03-15 08:36:06
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
int dp[2005], a[2005], n, k;
void solve() {cin >> n >> k;for (int i = 1; i <= n; ++i) {cin >> a[i];}dp[1] = a[1];for (int i = 1; i <= n; ++i) {if (i >= k + 1)dp[i] = max(dp[i - 1], dp[i - k - 1] + a[i]);elsedp[i] = max(a[i],dp[i - 1]);}cout << dp[n] << endl;
}
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t = 1;//cin >> t;while (t--) {solve();}return 0;
}