AT_dp_b Frog 2题解

题目描述

有 N 个台阶。每个台阶编号为 1,2,…,N。对于每个 i(1≤i≤N),第 i 个台阶的高度为 hi​。

一只青蛙最初站在第 1 个台阶上。青蛙可以多次进行如下操作,试图到达第 N 个台阶:

  • 当青蛙在第 i 个台阶时,可以跳到第 i+1,i+2,…,i+K 中的任意一个台阶。假设跳到第 j 个台阶,则需要支付的代价为 ∣hi​−hj​∣。

请你求出青蛙到达第 N 个台阶所需支付的总代价的最小值。

输入格式

输入以如下格式从标准输入读入:

N K h1​ h2​ … hN​

输出格式

输出青蛙需要支付的总代价的最小值。

显示翻译

题意翻译

输入输出样例

输入 #1复制

5 3
10 30 40 50 20

输出 #1复制

30

输入 #2复制

3 1
10 20 10

输出 #2复制

20

输入 #3复制

2 100
10 10

输出 #3复制

0

输入 #4复制

10 4
40 10 20 70 80 10 20 70 80 60

输出 #4复制

40

说明/提示

限制条件

  • 所有输入均为整数。
  • 2≤N≤105
  • 1≤K≤100
  • 1≤hi​≤104

样例解释 1

如果青蛙依次跳到台阶 1→2→5,总代价为 ∣10−30∣+∣30−20∣=30。

样例解释 2

如果青蛙依次跳到台阶 1→2→3,总代价为 ∣10−20∣+∣20−10∣=20。

样例解释 3

如果青蛙直接跳到台阶 1→2,总代价为 ∣10−10∣=0。

样例解释 4

如果青蛙依次跳到台阶 1→4→8→10,总代价为 ∣40−70∣+∣70−70∣+∣70−60∣=40。

由 ChatGPT 4.1 翻译

思路

DP即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],f[100005];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	memset(f,0x3f3f3f3f,sizeof(f));
	f[1]=0;
	for(int i=2;i<=n;i++){
		for(int j=max(1ll,i-m);j<=i-1;j++){
			f[i]=min(f[i],f[j]+abs(a[i]-a[j]));
		}		
	}
	cout<<f[n]<<endl;
	return 0;
}

posted @ 2025-10-22 20:54  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源