Tiêu đề cho biết tất cả.Số cách viết n là tổng số k với các giới hạn trên mỗi phần
tôi cần phải chia n
như tổng của k
phần trong đó mỗi phần k i phải ở trong phạm vi của = k i < = r i cho mảng cho r
.
ví dụ -
n = 4, k = 3 and r = [2, 2, 1]
ans = 2
#[2, 1, 1], [1, 2, 1]
thứ tự các vấn đề. (2, 1, 1) và (1, 2, 1) khác nhau.
Tôi đã dạy cách giải quyết nó bằng cách sử dụng phương pháp sao và thanh, nhưng là do giới hạn trên r i tôi không biết cách tiếp cận nó.
tôi đã triển khai chức năng đệ quy trực tiếp và chỉ hoạt động tốt cho các giá trị nhỏ.
hạn chế của vấn đề gốc là
1 <= n <= 10
7
1 <= k <= 10
5
1 <= r
i
<= 51
Tất cả các phép tính sẽ được thực hiện dưới Modulo chính.
tôi đã tìm thấy sự cố tương tự ở đây nhưng tôi không biết cách triển khai trong chương trình. HERE
My brute-force đệ quy chức năng -
#define MAX 1000
const int md = 1e9 + 7;
vector <int> k;
vector <map<int, int>> mapper;
vector <int> hold;
int solve(int sum, int cur){
if(cur == (k.size() - 1) && sum >= 1 && sum <= k[cur]) return 1;
if(cur == (k.size() - 1) && (sum < 1 || sum > k[cur])) return 0;
if(mapper[cur].find(sum) != mapper[cur].end())
return mapper[cur][sum];
int ans = 0;
int start = 1;
for(int i=start; i<=k[cur]; ++i){
int remain = sum - i;
int seg = (k.size() - cur) - 1;
if(remain < seg) break;
int res = solve(sum - i, cur + 1);
ans = (1LL * ans + res) % md;
}
mapper[cur][sum] = ans;
return ans;
}
int main(){
for(int i=0; i<MAX; ++i) k.push_back(51); // restriction for each part default 51
mapper.resize(MAX);
cout << solve(MAX + MAX, 0) << endl;
}
Thay vì sử dụng bản đồ để lưu trữ kết quả tính toán tôi được sử dụng một mảng hai chiều và nó đã cho tăng hiệu suất rất tốt, nhưng tôi không thể sử dụng nó vì lớn n và k giá trị.
Làm cách nào tôi có thể cải thiện chức năng đệ quy của mình hoặc cách khác để giải quyết vấn đề này.
Bạn có thể chia sẻ liên kết của vấn đề ban đầu, nếu có thể không? Câu hỏi trở nên đơn giản hơn nhiều nếu giới hạn trên giống nhau cho mỗi phân vùng nhưng dường như nó không phải từ ví dụ bạn đã cung cấp. – Suparshva
'k' luôn bằng kích thước của' r'? – ImaginaryHuman072889
@ ImaginaryHuman072889 Có luôn. – Atul