Pagini recente » Cod sursa (job #498031) | Cod sursa (job #5063) | Cod sursa (job #2296994) | Cod sursa (job #2090895) | Cod sursa (job #2984820)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 2000 + 123;
uint32_t dp[NMAX][NMAX];
// dp[i][j] = numar de p-subsiruri care au ultimul element v[i] si penultimul element are valoarea j
int main() {
int n; cin >> n;
vector<int> v(n); for(auto &e : v) cin >> e;
map<int, int> norm; for(auto e : v) norm[e] = 1;
{ int cnt = 1; for(auto &e : norm) e.second = cnt++; }
for(auto &e : v) e = norm[e];
uint32_t rasp = 0;
for(int i = 0; i < n; i++) { // calculam linia i, cu valoarea a[i]
for(int j = 0; j < i; j++) { // incercam sa facem dp[i][v[j]] cu ultimele doua elemente {..., v[j], v[i]}
uint32_t cnt = 1; // numar de p-subsiruri care se termina cu {..., v[j], v[i]}
// initial cnt = 1 fiindca doar {v[j], v[i]} = p-subsir (e de lungime 2)
if(v[i] > v[j]) {
// putem sa continuam subsiruri de forma {..., x, v[j]} (numarate in dp[j][x]) cu {v[i]} <-> x > v[i] && v[i] > v[j]
/* for(int x = v[i] + 1; x < NMAX; x++) {
cnt += dp[j][x];
} */
cnt += dp[j][NMAX - 1] - dp[j][v[i]];
// cnt += sume_partiale[NMAX - 1] - sume_partiale[v[i]];
}
if(v[i] < v[j]) {
// putem sa continuam subsiruri de forma {..., x, v[j]} (numarate in dp[j][x]) cu {v[i]} <-> x < v[i] && v[i] < v[j]
/* for(int x = 0; x < v[i]; x++) {
cnt += dp[j][x];
} */
cnt += dp[j][v[i] - 1];
}
// numara p-subsiruri care se termina cu {..., v[j], v[i]}
dp[i][v[j]] += cnt;
}
for(int x = 0; x < NMAX; x++) {
rasp += dp[i][x];
if(x > 0) dp[i][x] += dp[i][x - 1]; // sume partiale peste dp[i][...]
}
}
cout << rasp << endl;
}