Cod sursa(job #1500636)

Utilizator tester_100Alin Barosanu tester_100 Data 12 octombrie 2015 13:45:57
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define nmax 2005

using namespace std;
int N,v[nmax];
int dp[nmax],maxx[nmax][nmax];

struct el{
 int x,y;
}a[nmax];
inline bool cmp(const el &A,const el &B){
    return A.x < B.x;
}
inline void Nrm(){
 int i;
  sort(a+1,a+N+1,cmp);
  v[a[1].y] = 1;
   for(i = 2; i <= N; ++i)
    if(a[i].x == a[i-1].x)
     v[a[i].y] = v[a[i-1].y];
   else v[a[i].y] = v[a[i-1].y] + 1;
}
inline void soc(){
 int i,j,best=0;
    dp[1] = 1;
    for(i = 0; i <= N; ++i)
        maxx[1][i] = 1;

    for(i = 2; i <= N; ++i){
        for(j = 1; j <= i; ++j){
            dp[i] = max(dp[i],maxx[j][v[i]]+1);
//            if(i == 4)
//                cout << maxx[j][v[i]]<<' ';
        }

      for(j = 0; j <= N; ++j){
        maxx[i][j] = max(maxx[i][j],maxx[j][v[i]]+1);
//        if(i == 2)
//            cout <<maxx[j][v[i]]<<' ';

        best=max(best,dp[i]);
      }
    }
  for(i = 1; i <= N; ++i)
  cout <<maxx[2][i]<<'\n';
}
int main(){
    int i,t;
    freopen("s2c.in","r",stdin);
    freopen("s2c.out","w",stdout);
    scanf("%d\n",&t);
    while(t--){
        scanf("%d\n",&N);
         for(i = 1; i <= N; ++i)
            scanf("%d ",&v[i]),a[i].x = v[i],a[i].y = i;
        Nrm();
        soc();
    }
    return 0;
}