Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// https://www.infoarena.ro/problema/subsiruri
- #include <bits/stdc++.h>
- #define modulo 9901
- using namespace std;
- ifstream fin ("subsiruri.in");
- ofstream fout ("subsiruri.out");
- int n, a[1007];
- int dp[1007], maximdp; /// lung celui mai lung subsir cresc care incepe la i
- int nr[1007]; /// nr de
- void Citire()
- {
- int i;
- fin >> n;
- for (i = 1; i <= n ; i++)
- fin >> a[i];
- /**
- for (i = 1; i <= n; i++)
- cout << a[i] << " ";
- cout << "\n";
- //*/
- }
- void DP()
- {
- int i, j, m;
- dp[n] = 1;
- for (i = n - 1; i >= 1; i--)
- {
- m = 0;
- for (j = i + 1 ; j <= n; j++)
- if (a[i] < a[j] && dp[j] > m)
- m = dp[j];
- dp[i] = m + 1;
- maximdp = max(maximdp, dp[i]);
- }
- fout << maximdp << "\n";
- /**
- for (i = 1; i <= n; i++)
- cout << dp[i] << " ";
- cout << "\n";
- //*/
- }
- void Rezolvare()
- {
- int i, j;
- int maxim;
- for (i = n; i >= 1; i--)
- if (dp[i] == 1) nr[i] = 1;
- else
- for (j = i + 1; j <= n; j++)
- if (a[i] < a[j] && dp[i] == dp[j] + 1)
- nr[i] = (nr[i] + nr[j]) % modulo;
- /**
- for (i = 1; i <= n; i++)
- cout << nr[i] << " ";
- cout << "\n";
- //*/
- maxim = 0;
- for (i = 1; i <= n; i++)
- if (dp[i] == maximdp)
- maxim = (maxim + nr[i]) % modulo;
- fout << maxim << "\n";
- }
- int main()
- {
- Citire();
- DP();
- Rezolvare();
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement