Cod sursa(job #1256768)

Utilizator xoSauceSergiu Ferentz xoSauce Data 6 noiembrie 2014 20:36:12
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
/*
 
 Dynamic Programming method.
 
 */
void read(vector<int> &v){
     int n;     
     cin >> n;
     for(int i = 0; i < n; i++){
          int x;
          cin >> x;
          v.push_back(x);
     }
}

void solve(const vector<int> &v){
     vector<int> best(v.size());
     vector<int> pre(v.size(),-1);
     best[0] = 1;
     int global_max = 1;
     int global_index = 0;
     for(int i = 1; i < v.size(); i++){
          int maxLen = 1;
          for(int j = 0; j < i; j++){
	if(v[j] < v[i]){
	     if(maxLen < 1+best[j]){
	          maxLen = 1+best[j];
	          pre[i] = j;
	     }
	}
          }
          if(global_max < maxLen){
	global_max = maxLen;
	global_index = i;
          }
          best[i] = maxLen;
     }
     
     printf("%d\n",global_max);
     vector<int> path;
     while(global_index != -1){
          path.push_back(global_index);
          global_index = pre[global_index];
     }
     for(int i = path.size()-1; i>=0; i--){
          printf("%d ",v[path[i]]);
     }
     printf("\n");
}

int main(){
     freopen("scmax.in","r",stdin);
     freopen("scmax.out","w",stdout);
     vector<int> v;
     read(v);
     solve(v);
}