AT_dp_a Frog 1题解
题目描述
有 N 个台阶。每个台阶编号为 1,2,…,N。对于每个 i(1≤i≤N),第 i 个台阶的高度为 hi。
一只青蛙最初在第 1 个台阶上。青蛙可以重复以下操作,试图到达第 N 个台阶:
- 当青蛙在第 i 个台阶时,可以跳到第 i+1 或第 i+2 个台阶。跳到目标台阶 j 时,需要支付的代价为 ∣hi−hj∣。
请你求出青蛙到达第 N 个台阶所需支付的总代价的最小值。
输入格式
输入通过标准输入按以下格式给出。
N h1 h2 … hN
输出格式
输出青蛙需要支付的总代价的最小值。
显示翻译
题意翻译
输入输出样例
输入 #1复制
4 10 30 40 20
输出 #1复制
30
输入 #2复制
2 10 10
输出 #2复制
0
输入 #3复制
6 30 10 60 10 60 50
输出 #3复制
40
说明/提示
限制条件
- 所有输入均为整数。
- 2≤N≤105
- 1≤hi≤104
样例解释 1
如果青蛙按 1→2→4 的顺序移动,则总代价为 ∣10−30∣+∣30−20∣=30。
样例解释 2
如果青蛙按 1→2 的顺序移动,则总代价为 ∣10−10∣=0。
样例解释 3
如果青蛙按 1→3→5→6 的顺序移动,则总代价为 ∣30−60∣+∣60−60∣+∣60−50∣=40。
由 ChatGPT 4.1 翻译
思路
直接DP即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,m=2,a[100005],f[100005];
int main(){
cin>>n;
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;
}

浙公网安备 33010602011771号