Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- std::vector<std::pair<int, int> > g[1007];
- int number_begin[1007], number_end[1007], sizea[1007];
- struct Otrezok
- {
- int l, r, size;
- Otrezok()
- {
- l = r = size = 0;
- }
- Otrezok(int _l, int _r, int _size)
- {
- l = _l;
- r = _r;
- size = _size;
- }
- };
- int d[1007];
- void Dfs(int x)
- {
- int to, len;
- for(size_t i = 0; i < g[x].size(); i++)
- {
- to = g[x][i].first;
- len = g[x][i].second;
- if(d[to] < d[x] + len)
- {
- d[to] = d[x] + len;
- Dfs(to);
- }
- }
- }
- int main()
- {
- std::ifstream fin("input.txt");
- std::ofstream fout("output.txt");
- int n, x;
- fin >> n;
- for(int i = 1; i <= n; i++)
- {
- fin >> x;
- if(number_begin[x] == 0)
- number_begin[x] = i;
- else
- number_end[x] = i;
- sizea[x]++;
- }
- std::vector<Otrezok> otr;
- int li, lj, ri, rj;
- for(int a = 1; a <= 100; a++)
- {
- if(number_begin[a] == 0) continue;
- li = number_begin[a];
- ri = number_end[a];
- if(ri == 0) ri = li;
- otr.push_back(Otrezok(li, ri, sizea[a]));
- }
- for(size_t i = 0; i < otr.size(); i++)
- {
- li = otr[i].l;
- ri = otr[i].r;
- g[0].push_back(std::make_pair((int)i + 1, otr[i].size));
- for(size_t j = 0; j < otr.size(); j++)
- {
- lj = otr[j].l;
- rj = otr[j].r;
- if(ri < lj)
- {
- g[(int)i + 1].push_back(std::make_pair((int)j + 1, otr[j].size));
- }
- }
- }
- Dfs(0);
- int num = (int)otr.size(), ans = 0;
- for(int i = 1; i <= num; i++) ans = std::max(ans, d[i]);
- fout << ans << std::endl;
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement