Trang chủ Tin Học Lớp 7 Dãy số Wavio là dãy số nguyên thỏa mãn các...

Dãy số Wavio là dãy số nguyên thỏa mãn các tính chất: các phần tử đầu sắp xếp thành 1 dãy tăng dần đến 1 phần tử đỉnh sau đó giảm dần. Ví dụ dãy số 1 2 3 4 5

Câu hỏi :

Dãy số Wavio là dãy số nguyên thỏa mãn các tính chất: các phần tử đầu sắp xếp thành 1 dãy tăng dần đến 1 phần tử đỉnh sau đó giảm dần. Ví dụ dãy số 1 2 3 4 5 2 1 là 1 dãy Wavio độ dài 7. Yêu cầu: Cho 1 dãy gồm N số nguyên, hãy chỉ ra một dãy con Wavio có độ dài lớn nhất trích ra từ dãy đó. code c++

Lời giải 1 :

- Lưu ý:

+ Code dưới ổn áp rồi :>

+ Máy chấm mình tìm được

    có GNU C++ không chạy được ;-; nên hãy nộp bằng GNU C++11, C++14, ...

- Code: 

#include <bits/stdc++.h>
using namespace std;

#define vi vector<int>
#define all(x) (x).begin(),(x).end()
#define pii pair<int, int>
#define vii vi::iterator
#define X first
#define Y second
const int Inf = 1e9 + 7;

vector<int> rev(vector<int> a, int i = -1, int j = -1) {
    if (i == -1) i = 0;
    if (j == -1) j = a.size() - 1;
    reverse(a.begin() + i, a.begin() + j + 1); 
    return a;
}

/*
vector<int> LIS(vector<int> a, int Lim = Inf) {
    vector<int> f;
    vector<int> res(a.size() + 1);
    
    for (int i = 0; i < a.size(); ++i) {
        if (a[i] < Lim) {
            auto it = lower_bound(f.begin(), f.end(), a[i]);
            if (it == f.end()) f.push_back(a[i]); else *it = a[i];
        }
        res[i + 1] = f.size();
    }
    return res;
}
*/

vector<int> LIS(vector<int> a, int Lim = Inf) {
    vector<int> res(a.size() + 1);
    
    for (int i = 0; i < a.size(); ++i) {
        res[i + 1] = 1;
        for (int j = 0; j < i; ++j) {
            if (a[i] > a[j]) res[i + 1] = max(res[i + 1], res[j + 1] + 1);
        }
    }
    return res;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    
    int n = 1;
    cin >> n;
    
    vector<int> a(n);
    for (int &x: a) cin >> x;
    
    vector<int> pref = LIS(a);
    vector<int> suff = rev(LIS(rev(a)), 1, n);
    
    int ans = 1;
    for (int i = 1; i <= n; ++i) if (pref[i] > 1 && suff[i] > 1) ans = max(ans, pref[i] + suff[i] - 1);
    cout << ans;
}

Thảo luận

-- Bạn còn cách nào khác ngoài dùng lower_bound với auto it không mình chưa học cái đó
-- đi hỏi solution phát
-- ok đã sửa

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, 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 (ảo). Với cách hiểu hiện nay, 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.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 7

Lớp 7 - Năm thứ hai ở cấp trung học cơ sở, một cuồng quay mới lại đến vẫn bước tiếp trên đường đời học sinh. Học tập vẫn là nhiệm vụ chính!

Nguồn : ADMIN :))

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

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

Copyright © 2021 HOCTAPSGK