题目概要:
有n个石头。这些石头分别编号为1, 2, …, n。每个石头i(1 ≤ i ≤ n) 的高度为ℎi。
最初,一只青蛙位于石头1上。青蛙将重复以下操作若干次,试图到达石头n。
当青蛙位于石头i时,它可以跳到石头i + 1或i + 2。在这种情况下,如果跳到石头j,则需要支付代价|hi − ℎj|。
求青蛙到达石头n之前需要支付的最小总代价。
题目分析:
这道题是一个典型的DP题目,首先,他是从第一个石头开始跳,并且第i块石头只能跳到i+1或i+2个石头,所以可以理所应当的想到i+1,i+2是基于i去推导的然后题目又给我们一个代价|hi − ℎj|,就可以得到转换公式
f[i+1]=min(f[i+1],f[i]+abs(h[i]-h[i+1]));
f[i+2]=min(f[i+2],f[i]+abs(h[i]-h[i+2]));
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int h[100005];
int f[100005];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
}
for(int i=2;i<=n;i++){
f[i]=2e9;
}
for(int i=1;i<=n;i++){
f[i+1]=min(f[i+1],f[i]+abs(h[i]-h[i+1]));
f[i+2]=min(f[i+2],f[i]+abs(h[i]-h[i+2]));
}
cout<<f[n]<<endl;
return 0;
}