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:
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
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]; }
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
ước downvote
Bài toán: Ếch nhảy qua các hòn đá Ý tưởng giải:
code vi du code
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; }
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Công thức:
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
ok :v:
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.cppBình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.