题解 AT4523 【Frog 2】
分析
我们读完这道题之后,可以发现它让我们求一个最小值,我们就可以想到一个算法:动态规划。
动态规划最重要的就是定义状态和转移状态,我们根据问什么设什么的方法,就想到定义\(dp_i\)为调到\(i\)的最小代价。
思考一下,我们的\(dp_i\)是怎么来的呢?它是由所有前面能到达的石头在加上代价而得到的。
那么就有转移方程:\(dp_i=\max{dp_j+|h_i-h_j|}(j+k\geq i)\)
于是代码就出来了。
代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
int n, k, h[MAXN], dp[MAXN];
int main()
{
cin >> n >> k;
for(int i = 1; i <= n; i ++)
cin >> h[i];
memset(dp, 0x3f, sizeof dp);
dp[1] = 0;
for(int i = 2; i <= n; i ++)
for(int j = max(1, i - k); j < i; j ++)
dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]));
cout << dp[n];
return 0;
}
制作不易,点个赞在走吧(QAQ)