Mənfəətin maksimumlaşdırılması#11480

Mənfəətin maksimumlaşdırılması (Həll təhlili)

Güman edək ki, p_0, p_1, ..., p_{n-1} — günlər üzrə səhm qiymətləridir. dp_i = max(p_i, ..., p_{n-1}) hesablayaq — massivinin sufikslərində maksimum qiyməti. Əgər -ci gündə səhm p_i qiymətinə alınarsa, gələcəkdə onu ən yüksək dp_i qiymətinə satmaq əlverişli olacaq, və mənfəət dp_i - p_i təşkil edəcək. Ümumi mənfəəti hesablamaq qalır, bərabərdir:

\sum_{i=0}^{n - 1} (dp_i - p_i)

Misal

İkinci testi nəzərdən keçirək. Səhm qiymətləri massivində sufikslər üzrə maksimumu hesablayaq.

Məsələn, birinci gündə səhmi p_1 = 2 qiymətinə alırıq və gələcəkdə onu dp_1 = 9 qiymətinə satırıq (satış üçüncü gündə həyata keçiriləcək).

Ümumi mənfəət 4 + 7 + 3 + 0 + 7 + 2 + 3 + 0 + 0 = 26 təşkil edəcək.

Alqoritmin həyata keçirilməsi

Giriş məlumatlarını oxuyuruq.

scanf("%d", &n);
p.resize(n);
dp.resize(n);
for (i = 0; i < n; i++)
  scanf("%d", &p[i]);

dp_i = max(p_i, ..., p_{n-1}) hesablayaq.

dp[n - 1] = p[n - 1];
for (i = n - 2; i >= 0; i--)
  dp[i] = max(p[i], dp[i + 1]);

Ümumi mənfəət -i hesablayaq. -ci gündə səhmi p_i qiymətinə alırıq və gələcəkdə onu dp_i qiymətinə sataraq dp_i - p_i mənfəəti əldə edirik.

res = 0;
for (i = 0; i < n; i++)
  res = res + dp[i] - p[i];

Nəticəni çapa veririk.

printf("%lld\n", res);

Python həyata keçirilməsi

Giriş məlumatlarını oxuyuruq.

n = int(input())
p = list(map(int, input().split()))

dp_i = max(p_i, ..., p_{n-1}) hesablayaq.

dp = [0] * n
dp[n - 1] = p[n - 1]
for i in range(n - 2, -1, -1):
  dp[i] = max(p[i], dp[i + 1])

Ümumi mənfəət -i hesablayaq. -ci gündə səhmi p_i qiymətinə alırıq və gələcəkdə onu dp_i qiymətinə sataraq dp_i - p_i mənfəəti əldə edirik.

res = 0
for i in range(n):
  res += dp[i] - p[i]

Nəticəni çapa veririk.

print(res)