Solution
参考题解
此题看数据范围便大概猜出来是利用调和级数来写了。但是思维过程较复杂,状态的定义以及状态转移方程都不太好想。
Code
#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
#define ll long long int
const int N = 1e5 + 5, M = 5e6 + 6;
int cnt[M], a[N];
ll dp[M];
int main()
{
IOS;
int n; cin >> n;
int maxn = 0;
for (int i = 1; i <= n; i++)
cin >> a[i], cnt[a[i]]++,
maxn = max(maxn, a[i]);
for (int i = 1; i <= maxn; i++)
for (int j = i * 2; j <= maxn; j += i)
cnt[i] += cnt[j];
for (int i = 1; i <= maxn; i++)
dp[i] = (ll)cnt[i] * i;
ll ans = 0;
for (int i = maxn; i >= 1; i--)
for (int j = i; j <= maxn; j += i)
dp[i] = max(dp[i], dp[j] + (ll)i * ((ll)cnt[i] - cnt[j])),
ans = max(ans, dp[i]);
cout << ans << endl;
return 0;
}