M
mikelhpdatke
Xử lý xâu là đượcMình làm ý tưởng này rồi. Nhưng không thử test lớn được!!!
Mặc dù chỉ lấy ai mod 2 thoi!!! Chỉ xét tính chẳn lẻ nhưng số lớn vẫn không làm được @@
Xử lý xâu là đượcMình làm ý tưởng này rồi. Nhưng không thử test lớn được!!!
Mặc dù chỉ lấy ai mod 2 thoi!!! Chỉ xét tính chẳn lẻ nhưng số lớn vẫn không làm được @@
F[i, 1] = 1
F[i, i] = 1
Hai điều trên là hiển nhiên
F[i, j] = F[i - 1, j - 1] + j * F[i - 1, j]
Độ phức tạp: O(N * K)Tính F[i, j].
Giả sử đã chia được i - 1 phần tử vào j nhóm, như thế ta chỉ cần thêm 1 phần tử nữa vào một trong những nhóm đã chia thì ta được kết quả. Phần tử cần thêm có thể được thêm vào 1 trong j nhóm đã có. Như vậy công thức sẽ là j * F[i - 1, j].
Giả sử đã chia được i - 1 phần tử vào j - 1 nhóm, như thế ta chỉ cần thêm 1 phần tử nữa vào 1 nhóm mới. Tức là công thức là F[i - 1, j - 1]
Vậy CTTH là F[i - 1, j - 1] + j * F[i - 1, j]
Bài này số có lớn lắm đâu anhO(N*K*xử lý số lớn) chứ
)((())))(()())
6
Max(i - C[i]) với 0 <= i < N và st[i] == ')'
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <utility>
#include <algorithm>
#include <list>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cctype>
#include <cmath>
using namespace std;
typedef long long longs;
int main() {
string st;
int N, i;
cin >> st;
N = st.length();
int C[1000000], D[1000000];
stack<int> S;
for (i = 0; i < N; ++i) {
if (st[i] == '(') {
S.push(i);
}
else {
if (S.empty())
C[i] = D[i] = -1;
else {
D[i] = S.top();
S.pop();
if (st[D[i] - 1] == ')' && C[D[i] - 1] != -1)
C[i] = C[D[i] - 1];
else
C[i] = D[i];
}
}
}
for (i = 0; i < N; ++i)
C[i] = i - C[i];
int res = 0
for (i = 0; i < N; ++i) {
if (D[i] != -1 && st[i] == ')') res = max(res, C[i]);
}
if (res == 0)
cout << 0;
else
cout << res + 1;
return 0;
}
#include <bits/stdc++.h>
#define elif else if
using namespace std;
const int Maxn=1e6+10;
stack<int> ms;
char S[Maxn];
int F[Maxn];
main(){
ios_base::sync_with_stdio(false);
cin>>(S+1);
int n=strlen(S+1);
for(int i=1;S[i];i++){
if(S[i]=='(') ms.push(i);
elif(!ms.empty()) F[i]=F[ms.top()-1]+(i-ms.top()+1),ms.pop();
}
cout<<*max_element(F+1,F+n+1);
}
bài này từ năm 2012 rùi bạn ơiBài nào cũng có code rồi nhỉ
Cao nhân cho em xin fb được không ạ, tại em thấy khá khó hiểu nên muốn tham khảo cao nhân từng tí một theo kiểu mưa dầm thấm lâu ấy ạ!!Quy hoạch động là một phương pháp rất hiệu quả để giải các bài toán tối ưu tổ hợp. ý tưởng cơ bản của phương pháp này là: để có lời giải của bài toán tối ưu kích thước n, ta giải các bài toán tương tự có kích thước nhỏ hơn và phối hợp lời giải của chúng để được lời giải của bài toán ban đầu. Đó chính là tư tưởng chia để trị một cách rất nghiêm ngặt.
Không phải bài toán nào cũng có thể giải bằng quy hoạch động. Để giải được bằng quy hoạch động, bài toán thoả mãn nguyên lý tối ưu Bellman: mọi dãy con của một dãy tối ưu cũng phải là dãy tối ưu.
Thông thường hàm mục tiêu của bài toán được xây dựng từ một hàm có dạng: f(n) = max(f(k)+g(n)), trong đó k là một số giá trị phù hợp nhỏ hơn n.
Hàm f(n) được gọi là hàm quy hoạch động. Việc tính giá trị hàm f được hiện từ dưới lên, tức là các giá trị n nhỏ được tính trước. Tất cả các kết quả được lưu vào bảng để phục vụ cho việc tính hàm quy hoạch động với các giá trị n lớn hơn.
Chúng ta sẽ xem xét một số bài toán quy hoạch động tiêu biểu để minh hoạ cho các tư tưởng trên.
fb.com/thanhkhoeoCao nhân cho em xin fb được không ạ, tại em thấy khá khó hiểu nên muốn tham khảo cao nhân từng tí một theo kiểu mưa dầm thấm lâu ấy ạ!!