提交时间:2024-10-11 15:29:09

运行 ID: 33581

#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; int n, a[130], c[130]; long long g[130][130]; long long f[750010]; struct node { int d[130]; int cal() { int ans = 0; for (int i = 1; i <= n; i++) ans = ans * (c[i] + 1) + d[i]; return ans; } }; int lcm(int x, int y) { return x * y / __gcd(x, y); } long long tmp; void work(int l, int r) { for (int i = l; i < r; i++) tmp += lcm(a[i], a[r]) * 2; tmp += a[r]; } long long dfs(node step) { int num = step.cal(); if (num == 0) return 0; if (f[num]) return f[num]; int pos = 0; for (int i = 1; i <= n; i++) pos += step.d[i] * i; for (int i = 1; i <= n; i++) if (step.d[i] && pos >= i) { step.d[i]--; f[num] = max(f[num], dfs(step) + g[pos - i + 1][pos]); step.d[i]++; } return f[num]; } int main() { // freopen("array.in", "r", stdin); // freopen("array.out", "w", stdout); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> c[i]; for (int i = 1; i <= n; i++) { tmp = 0; for (int j = i; j <= n; j++) { work(i, j); g[i][j] = tmp; } } node st; for (int i = 1; i <= n; i++) st.d[i] = c[i]; cout << dfs(st) << endl; // fclose(stdin); // fclose(stdout); return 0; }