Trang chủ Tin Học Lớp 10 Kỳ nghỉ hè của Taro bắt đầu vào ngày mai,...

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

Câu hỏi :

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:

  • A: Bơi ở biển - nhận được �� điểm hạnh phúc.
  • B: Bắt bọ trên núi - nhận được �� điểm hạnh phúc.
  • C: Làm bài tập ở nhà - nhận được �� điểm hạnh phúc.

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

  • Dòng đầu tiên là số nguyên  (1≤�≤105)
  • Dòng thứ  trong số  dòng tiếp theo chứa 3 số nguyên ��, ��, �� (1≤��,��,��≤104) lần lượt là điểm hạnh phúc có thể nhận được khi Taro tham gia hoạt động �,�,� của ngày thứ �.

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

Lời giải 1 :

`*` 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;
}

Bạn có biết?

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!

Nguồn :

Wikipedia - Bách khoa toàn thư

Tâm sự lớp 10

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!

Nguồn :

sưu tập

Liên hệ hợp tác hoặc quảng cáo: gmail

Điều khoản dịch vụ

Copyright © 2021 HOCTAPSGK