这里为什么#8WA了?
查看原帖
这里为什么#8WA了?
1241218
KFZX_xiaohao楼主2024/1/10 22:19

题面翻译

NN 个石头,编号为 1,2,...,N1,2,...,N。对于每个 i(1≤i≤N)i(1 \leq i \leq N),石头 ii 的高度为 hih_i。

最初有一只青蛙在石头 11 上。他将重复几次以下操作以到达石头 NN:

  • 如果青蛙当前在石头 ii 上,则跳到石头 i+1i+1 或石头 i+2i+2。需要 ∣hi−hj∣|h_i - h_j| 的费用,而 jj 是要落到上面的石头。

找到青蛙到达石头 NN 之前需要的最小总费用。

题目描述

NN 個の足場があります。 足場には 1, 2, …, N1,\ 2,\ \ldots,\ N と番号が振られています。 各 ii (1 ≤ i ≤ N1\ \leq\ i\ \leq\ N) について、足場 ii の高さは hih_i です。

最初、足場 11 にカエルがいます。 カエルは次の行動を何回か繰り返し、足場 NN まで辿り着こうとしています。

  • 足場 ii にいるとき、足場 i + 1i\ +\ 1 または i + 2i\ +\ 2 へジャンプする。 このとき、ジャンプ先の足場を jj とすると、コスト ∣hi − hj∣|h_i\ -\ h_j| を支払う。

カエルが足場 NN に辿り着くまでに支払うコストの総和の最小値を求めてください。

输入格式

入力は以下の形式で標準入力から与えられる。

NN h1h_1 h2h_2 …\ldots hNh_N

输出格式

カエルが支払うコストの総和の最小値を出力せよ。

样例 #1

样例输入 #1

4
10 30 40 20

样例输出 #1

30

样例 #2

样例输入 #2

2
10 10

样例输出 #2

0

样例 #3

样例输入 #3

6
30 10 60 10 60 50

样例输出 #3

40

提示

制約

  • 入力はすべて整数である。
  • 2 ≤ N ≤ 1052\ \leq\ N\ \leq\ 10^5
  • 1 ≤ hi ≤ 1041\ \leq\ h_i\ \leq\ 10^4

Sample Explanation 1

足場 11 → 22 → 44 と移動すると、コストの総和は ∣10 − 30∣ + ∣30 − 20∣ = 30|10\ -\ 30|\ +\ |30\ -\ 20|\ =\ 30 となります。

Sample Explanation 2

足場 11 → 22 と移動すると、コストの総和は ∣10 − 10∣ = 0|10\ -\ 10|\ =\ 0 となります。

Sample Explanation 3

足場 11 → 33 → 55 → 66 と移動すると、コストの総和は ∣30 − 60∣ + ∣60 − 60∣ + ∣60 − 50∣ = 40|30\ -\ 60|\ +\ |60\ -\ 60|\ +\ |60\ -\ 50|\ =\ 40 となります。

//dp[i]=min(dp[i-1]+abs(h[i]-h[i-1]),dp[i-2]+abs(h[i]-h[i-2])
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,h[100009],dp[100009];
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>h[i];
    }
    dp[1]=0;
    dp[2]=abs(h[2]-h[1]);
    for(int i=2;i<=n;i++){
        dp[i]=min(dp[i-1]+abs(h[i]-h[i-1]),dp[i-2]+abs(h[i]-h[i-2]));
    }
    cout<<dp[n];
}

2024/1/10 22:19
加载中...