Kỳ nghỉ hè của Taro bắt đầu vào ngày mai, nên anh ấy đã quyết định lên kế hoạch cho nó ngay bây giờ.
Kỳ nghỉ bao gồm N ngày. Vào ngày thứ � (1≤�≤�), Taro sẽ chọn và tham gia một trong các hoạt động sau:
Vì Taro dễ cảm thấy buồn chán nên anh không thể tham gia các hoạt động giống nhau trong hai ngày liên tiếp trở lên.
Tìm tổng số điểm hạnh phúc tối đa mà Taro có thể nhận được.
Input
Output
In ra một số nguyên duy nhất là tổng điểm hạnh phúc tối đa mà Taro có thể nhận được.
Sample 1InputCopy3 10 40 70 20 50 80 30 60 90 OutputCopy210
Nếu Taro tham gia các hoạt động theo thứ tự �,�,�, anh ấy sẽ có được 70+50+90=210 điểm hạnh phúc
Sample 2InputCopy1 100 10 1 OutputCopy100 Sample 3InputCopy7 6 7 8 8 8 3 2 5 2 7 8 6 4 6 8 2 3 4 7 5 1 OutputCopy46
`*` Ta sẽ có công thức Quy hoạch động:
Gọi `DP[i][j] quad (i: 1 -> n, j in {1, 2, 3})` là số điểm lớn nhất của Taro ở ngày thứ `i` với lựa chọn hoạt động `j` (Ta định nghĩa `j = 1`: Hoạt động A, `j = 2`: Hoạt động B, `j = 3`: Hoạt động C).
Xét trường hợp nếu chọn hoạt động A, vì ngày trước đó không thể là hoạt động A nên ta sẽ có 2 cách chọn:
`-` Chọn hoạt động cuối cùng ở ngày i - 1 là B và kết hợp với hoạt động A ngày thứ i: `DP[i][1] = DP[i - 1][2] + a[i]`
`-` Chọn hoạt động cuối cùng ở ngày i - 1 là C và kết hợp với hoạt động A ngày thứ i: `DP[i][1] = DP[i - 1][3] + a[i]`
Ta lấy max của 2 trường hợp `=> DP[i][1] = max(DP[i - 1][2], dp[i - 1][3]) + a[i]` (Vì a[i] chung nên ta chỉ cần lấy max giữa (DP[i - 1][2], dp[i - 1][3])
`*` Tương tự với 2 trường hợp còn lại
Tổng quát:
`*` DP[i][1] = max(DP[i - 1][2], dp[i - 1][3]) + a[i]
`*` DP[i][2] = max(DP[i - 1][1], dp[i - 1][3]) + b[i]
`*` DP[i][3] = max(DP[i - 1][1], dp[i - 1][2]) + c[i]
$\texttt{C++ (AC)}$
#include <bits/stdc++.h>
using namespace std;
int dp[100001][4], a[100001], b[100001], c[100001];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];
for (int i = 1; i <= n; i++) {
dp[i][1] = max(dp[i - 1][2], dp[i - 1][3]) + a[i];
dp[i][2] = max(dp[i - 1][1], dp[i - 1][3]) + b[i];
dp[i][3] = max(dp[i - 1][1], dp[i - 1][2]) + c[i];
}
cout << max(dp[n][1], max(dp[n][2], dp[n][3]));
return 0;
}
Tin học là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng. Tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin. Hãy tận dụng sức mạnh của tin học để giải quyết các vấn đề và sáng tạo ra những giải pháp mới!
Lớp 10 - Năm đầu tiên ở cấp trung học phổ thông, chúng ta sẽ có nhiều bạn bè mới đến từ những nơi khác nhau. Ngôi trường mới, xa nhà hơn, mở ra một thế giới mới với nhiều điều thú vị. Hãy mở lòng đón nhận và tận hưởng những trải nghiệm mới!
Copyright © 2021 HOCTAPSGK