- Bạn đăng đề bài thiếu scope, mảng này bao nhiêu phần tử? cái này cũng có thể ảnh hưởng đến sự lựa chọn giải pháp
- Bạn không giải thích ý tưởng của mình khi viết đoạn code đó thì ai biết bạn nghĩ gì
Trông sơ qua thì đoạn này có vấn đề sum[i] = std::max(a[i], sum[j] + a[i]);
ví dụ có mảng a: 5 2 4 7
sẽ được mảng sum: 5 2 9 9
trong khi đáp án cuối cùng phải là 5 + 7 = 12
sửa lại sum[i] = std::max(sum[i], sum[j] + a[i]);
tất nhiên là khởi tạo mảng sum = 0 hết cho nó có giá trị để so sánh. cũng chưa chắc là đúng chưa, nhưng trước mắt là vậy
mà có như vậy thì cũng quá thời gian mà thôi
=> bạn vừa bị chạy quá thời gian mà còn bị sai nữa
Với bài này nhìn qua thì dùng quy hoạch động, độ phức tạo O(n)
Giải pháp như sau
Ở mảng a, sẽ có những phần tử “được lấy” để tính tổng, và những phần tử “không được lấy”
như vậy mới mỗi phần tử ở vị trí i thì ta cần đặt câu hỏi, lấy thì sao, không lấy thì sao? kết quả tốt nhất nếu lấy, kết quả tốt nhất nếu không lấy
=> cần mảng để lưu kết quả khi xét phần tử r[2][n],
với r[0][i] là kết quả tốt nhất khi không lấy phần tử i
với r[1][i] là kết quả tốt nhất khi có lấy phần tử i
(khi xét mảng từ đầu tới i)
quy hoạch động thì có 2 cái cốt lõi
- khởi tạo
r[0][0] = 0; // mới xét có thằng đầu tiên mà không lấy thì kết quả khi không lấy là 0 thôi
r[1][0] = a[0]; // tương tự, kết quả là a[0]
- công thức truy hồi (với i > 0), như ở trên có nói, với mỗi phần tử i, thì ta có thể lấy hoặc không lấy
- nếu không lấy phần tử i (tính r[0][i]): thì phần tử thứ i-1 lấy hay không lấy cũng được, chỉ việc chọn cách tốt hơn tính tới bước trước
r[0][i] = max(r[0][i-1], r[1][i-1])
- nếu lấy phần tử i (tính r[1][i]): lúc này không được tự do nữa, bắt buộc không được lấy phần tử i-1
r[1][i] = a[i] + r[0][i-1]
đáp án cuối cùng là max(r[0][n-1], r[1][n-1]) (index start at 0)
p/s: thông thường bài như này mình sẽ ignore, nhưng loại bài này là điển hình của giải thuật quy hoạch động nên cũng muốn góp 1 câu trả lời, hy vọng sẽ giúp được gì đó
bài này còn có thể không dùng mảng (bỏ luôn cả mảng a dùng để nhập), bạn hứng thú thì tự tối ưu code thêm