Loading

题解 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;
}
posted @ 2021-01-28 16:36  zhangwenxuan  阅读(118)  评论(0编辑  收藏  举报