Atcoder Educational DP Contest A - Frog 1

Xem dạng PDF

Gửi bài giải


Điểm: 0,10 (OI)
Giới hạn thời gian: 2.0s
Giới hạn bộ nhớ: 1G
Input: stdin
Output: stdout

Người đăng:
Nguồn bài:
Atcoder Educational DP Contest
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Có ~N~ hòn đá, được đánh số từ ~1~ đến ~N~. Với mỗi chỉ số ~i~ ~(1 \le i \le N)~, độ cao của hòn đá thứ ~i~ là ~h_{i}~

Ban đầu, có một chú ếch đang ngồi ở hòn đá thứ nhất và chú sẽ thực hiện liên tục một loạt các hành động sau:

  • Nếu chú đang ngồi ở hòn đá ~i~ chú có thể nhảy đến hòn đá thứ ~i+1~ hoặc ~i+2~. Chú sẽ mất chi phí khi nhảy là ~|h_{i} - h_{j}|~ với ~j~ là hòn đá mà chú ếch nhảy đến.

Bạn hãy giúp chú ếch tìm chi phí tối thiểu để nhảy từ hòn đá thứ nhất đến hòn đá thứ ~N~ nhé.

Input

  • Dòng đầu tiên của dữ liệu vào chứa số nguyên dương ~N~ ~(2 \le N \le 10^{5})~, là số lượng hòn đá.
  • Dòng thứ hai gồm ~N~ số nguyên ~h_{i}~ ~(1 \le i \le N, 1 \le h_{i} \le 10^{4})~, là độ cao của hòn đá thứ ~i~.

Output

  • Gồm một số nguyên, là chi phí ít nhất để nhảy từ hòn đá thứ nhất đến hòn đá thứ ~N~.

Sample 1

Input
4
10 30 40 20
Output
30
Giải thích

Một đường đi tối ưu là: ~1 \rightarrow 2 \rightarrow 4~. Chi phí sẽ là ~|10 - 30| + |30 - 20| = 30~.

Sample 2

Input
2
10 10
Output
0
Giải thích

Một đường đi tối ưu là: ~1 \rightarrow 2~. Chi phí sẽ là ~|10 - 10|= 0~.

Sample 3

Input
6
30 10 60 10 60 50
Output
40
Giải thích

Một đường đi tối ưu là: ~1 \rightarrow 3 \rightarrow 5 \rightarrow 6~. Chi phí sẽ là ~|30−60|+|60−60|+|60−50|=40~.


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    hanguyen140210  đã bình luận lúc 6, Tháng 1, 2026, 7:15

    include<bits/stdc++.h>

    using namespace std;

    define vec vector

    define ll long long

    int i,j; int main(){ iosbase::syncwithstdio(0); cin.tie(0);cout.tie(0); int n;cin>>n; vec<int>a(n),dp(n,INTMAX); for(int&x:a)cin>>x; dp[0]=0; for(i=0;i<n;i++){ if(i+1<n)dp[i+1]=min(dp[i+1],dp[i]+abs(a[i]-a[i+1])); if(i+2<n)dp[i+2]=min(dp[i+2],dp[i]+abs(a[i]-a[i+2])); } cout<<dp[n-1]; }


  • 3
    vominhmanh10  đã bình luận lúc 30, Tháng 10, 2025, 12:11

    có thể tối ưu bộ nhớ xuống O(1) vì tính dp chỉ dựa vào 2 dp trước đó, nhưng kệ đi

    inf = int(1e18)
    n = int(input())
    a = list(map(int, input().split()))
    dp = [inf] * n
    dp[0] = 0
    dp[1] = abs(a[1] - a[0])
    for i in range(2, n): 
        dp[i] = min(dp[i - 1] + abs(a[i] - a[i - 1]), dp[i - 2] + abs(a[i] - a[i - 2]))
    print(dp[n - 1])
    

  • -2
    LVT_K66_TRANDUYBAO  đã bình luận lúc 12, Tháng 10, 2025, 16:51

    ước downvote


  • 11
    ChiPhatNguyen  đã bình luận lúc 15, Tháng 8, 2025, 16:03 chỉnh sửa

    Bài toán: Ếch nhảy qua các hòn đá Ý tưởng giải:

    • Gọi dp[i] là chi phí ít nhất để nhảy đến hòn đá thứ i.
    • Trường hợp cơ sở:
      • dp[1] = 0 (vì bắt đầu từ hòn đá 1 không mất chi phí).
      • dp[2] = |h2 - h1|.
    • Công thức quy hoạch động: dp[i] = min(dp[i-1] + |hi - h(i-1)|, dp[i-2] + |hi - h(i-2)|)
    • Kết quả cần tìm là dp[n]. Độ phức tạp:
    • Thời gian: O(n)
    • Bộ nhớ: O(n)

    code vi du code


  • -3
    nguyenmanhhung18092012  đã bình luận lúc 31, Tháng 7, 2025, 15:12

    include <bits/stdc++.h>

    using namespace std; int main() { int n; cin >> n; vector<int> h(n); for (int i = 0; i < n; ++i) cin >> h[i]; vector<int> v(n, 0); v[0] = 0; if (n >= 2) v[1] = abs(h[1] - h[0]); for (int i = 2; i < n; ++i) { v[i] = min( v[i-1] + abs(h[i] - h[i-1]), v[i-2] + abs(h[i] - h[i-2]) ); } cout << v[n-1] << '\n'; return 0; }


  • -6
    vutuankiet  đã bình luận lúc 29, Tháng 6, 2025, 5:25

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • 2
    Vinh9699  đã bình luận lúc 22, Tháng 4, 2025, 13:54

    Công thức:

    DP[i] = min(abs(List[i - 1] - List[i]) + DP[i-1], abs(List[i - 2] - List[i])+ DP[i-2]);


  • -5
    iphone2207_  đã bình luận lúc 19, Tháng 1, 2025, 11:09

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -7
    chuthang050520008  đã bình luận lúc 2, Tháng 12, 2024, 6:59

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -5
    iphone2207_  đã bình luận lúc 30, Tháng 10, 2024, 11:43

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -16
    khiemgia1105  đã bình luận lúc 4, Tháng 10, 2024, 7:47

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -34
    jard  đã bình luận lúc 23, Tháng 9, 2024, 14:57

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -13
    bquanghien1902  đã bình luận lúc 4, Tháng 9, 2024, 7:33

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -7
    nb_truonghansieu_legiabao  đã bình luận lúc 20, Tháng 7, 2024, 15:24 sửa 5

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -14
    HoàngShine37  đã bình luận lúc 17, Tháng 7, 2024, 4:29

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -38
    jard  đã bình luận lúc 27, Tháng 4, 2024, 9:00

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • -3
      MalazeKL  đã bình luận lúc 28, Tháng 4, 2024, 14:33

      ok :v:


  • 3
    Nguyen_le2632007  đã bình luận lúc 18, Tháng 4, 2024, 11:52 chỉnh sửa

    Giống editorial nhưng mình code theo đệ quy cho dễ hình dung hơn. https://github.com/Clitch01/DSA-/blob/master/Dynamic%20Programming%20Problems/A_Frog_1.cpp


  • -33
    khoihk20  đã bình luận lúc 29, Tháng 9, 2023, 2:53

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -52
    nthquan_1505  đã bình luận lúc 30, Tháng 3, 2023, 4:22

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -76
    itk11_thanhbinh  đã bình luận lúc 11, Tháng 1, 2023, 7:39

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.