DPSEQ - Trò chơi với dãy số
Xem dạng PDF
Gửi bài giải
Điểm:
1,00 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift
Trên trục tọa độ, tại các điểm có tọa độ nguyên trong đoạn ~[1;N]~ có ghi các số ~a_i~. Ban đầu người chơi đứng ở điểm có tọa độ là ~0~ với tổng điểm là ~0~. Mỗi bước di chuyển người chơi có thể di chuyển sang phải tối thiểu là ~1~ bước, tối đa là ~K~ bước. Khi đến điểm nào thì số nguyên ở điểm đó sẽ được cộng vào tổng điểm của người chơi. Người chơi có thể dừng lại bất cứ khi nào họ muốn. Hãy tìm cách chơi để đạt tổng điểm lớn nhất.
Input
- Dòng đầu chứa hai số nguyên dương ~N~ và ~K~ cách nhau bởi một khoảng trắng;
- Dòng thứ hai ghi ~N~ số ~a_1, a_2, \ldots. a_N~, mỗi số cách nhau bởi một khoảng trắng.
Giới hạn:
- ~2 ≤ N ≤ 10000; 1 ≤ k ≤ 10 -1000 ≤ a_i ≤ 1000~
Output
- Giá trị tổng điểm lớn nhất mà người chơi có thể giành được.
Sample
Input #1
5 2
-2 3 -6 -4 5
Output #1
4
Hint
- Xem ví dụ #1, người chơi di chuyển như sau: ~0→2→4→5~, tổng điểm là ~3 + (-4) + 5 = 4~
Problem source: Chuyên Sơn La Online Judge
Bình luận
Hint: *Ý tưởng *
dp[i]= tổng điểm lớn nhất để đến được ôi.dp[0] = 0, từ mỗi ôithử nhảy sang các ôi+1đếni+k.dp[ni] = max(dp[ni], dp[i] + a[ni]).O(N*K).max(dp[1..n], 0).code tham khảo (c++)
include <bits/stdc++.h>
using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }
include <bits/stdc++.h>
using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }
bao đúng
include <bits/stdc++.h>
using namespace std; int main() { ios::syncwithstdio(false); cin.tie(nullptr); int N, K; cin>>N>>K; vector<int> a(N+1); for(int i = 1; i <= N; i++){ cin >> a[i]; } const int NEGINF=-1000000000; vector<int>dp(N+1,NEGINF); dp[0]=0; for(int i=0;i<=N;i++){ if(dp[i]==NEG_INF)continue; for(int j = 1; j <= K; j++){ int ni = i + j; if(ni > N) break; dp[ni] = max(dp[ni], dp[i] + a[ni]); } } int ans = 0; for(int i = 1; i <= N; i++){ ans = max(ans, dp[i]); } cout << ans << "\n"; return 0; }
include <bits/stdc++.h>
define fi first
define se second
define el '\n'
define pii pair<int,int>
define yes cout << "YES"
define no cout << "NO"
define pb push_back
define all(x) x.begin(),x.end()
using namespace std; typedef long long ll; typedef double db;
const ll mod = 1e9+7; const ll maxn = 1e5+7; const db pi = 3.14159265; const ll inf = 1e18;
ll n,k,ans=0; ll a[maxn],dp[maxn];
signed main() { iosbase::syncwith_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; for(int i = 1; i <= n; ++i) cin >> a[i];
}