Chọn K đoạn con

Đề bài

Mô tả

Cho dãy n số nguyên p1,p2,…,pn.

Bạn cần chọn ra k đoạn con:

[l1,r1],[l2,r2],…,[lk,rk]

thoả mãn đồng thời hai điều kiện:

  • Các đoạn rời nhau và xếp theo thứ tự tăng dần: 1≤l1≤r1<l2≤r2<…<lk≤rk≤n.
  • Mỗi đoạn có độ dài đúng bằng m: ri−li+1=m với mọi i.

Hãy chọn sao cho tổng các phần tử nằm trong k đoạn đó là lớn nhất, tức là cực đại hoá

∑i=1k∑j=liripj.

Lưu ý rằng bắt buộc phải chọn đủ k đoạn, kể cả khi một số phần tử trong đoạn mang giá trị nhỏ. Ràng buộc m×k≤n bảo đảm luôn tồn tại ít nhất một cách chọn hợp lệ.

Dữ liệu vào

  • Dòng đầu chứa ba số nguyên n, m, k.
  • Dòng thứ hai chứa n số nguyên p1,p2,…,pn.

Dữ liệu ra

In ra một số nguyên duy nhất là tổng lớn nhất có thể.

Ràng buộc

  • 1≤m×k≤n≤5000
  • 0≤pi≤109

Ví dụ

Input Output Giải thích
5 2 1
1 2 3 4 5
9 Chỉ chọn một đoạn dài 2. Đoạn tốt nhất là [4,5] với tổng 4+5=9.
7 1 3
2 10 7 18 5 33 0
61 Mỗi đoạn dài 1 nên chỉ cần lấy ba phần tử lớn nhất: 33+18+10=61.
4 2 2
1 10 10 1
22 Phải chọn đủ hai đoạn dài 2 và chúng không được chồng lên nhau, nên cách duy nhất là [1,2] và [3,4], cho tổng (1+10)+(10+1)=22. Chọn tham lam đoạn nặng nhất [2,3] trước sẽ không còn chỗ cho đoạn thứ hai.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0