Cod sursa(job #2022914)

Utilizator AlisRinja Alis Alis Data 17 septembrie 2017 18:04:58
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
//Given an array A, count the number of inversions in the array.
#include<bits/stdc++.h>
#include <string>
using namespace std;
vector<int> sol;
void buildSol(int posMax,vector<int>& a,vector<int>& dp){
    int searchValue=dp[posMax]-1;
    int posCurrent=posMax-1;
    if(posCurrent==-1){
        return;
    }
    for(int i=posCurrent;i>=0;i--){
        if(dp[i]==searchValue && a[i]<a[posMax]){
            sol.push_back(a[i]);
            buildSol(i,a,dp);
            break;
        }
    }
}
pair<int,int> liss(const vector<int> &A,vector<int>& dp) {
    for(int i=0;i<A.size();i++){
        dp.push_back(0);
    }
    dp[0]=1;
    for(int i=1;i<A.size();i++){
        int max=0;
        for(int j=0;j<i;j++){
            if(A[j]<A[i] && max<dp[j]){
                max=dp[j];
            }
        }
        dp[i]=1+max;
    }
    int max=0;
    int pos=0;
    for(int i=0;i<dp.size();i++){
        if(max<dp[i]){
            max=dp[i];
            pos=i;
        }
    }
    return make_pair(max,pos);
}
pair<int,vector<int>> lis(const vector<int> &A) {
    vector<pair<int,int>> dp;
    for(int i=0;i<A.size();i++){
        dp.push_back(make_pair(0,0));
    }
    dp[0].first=1;
    dp[0].second=-1;
    for(int i=1;i<A.size();i++){
        int max=0;
        int pos=-1;
        for(int j=0;j<i;j++){
            if(A[j]<A[i] && max<dp[j].first){
                max=dp[j].first;
                pos=j;
            }
        }
        dp[i].first=1+max;
        dp[i].second=pos;
    }
    int max=0;
    int maxPos=0;
    for(int i=0;i<dp.size();i++){
        if(max<dp[i].first){
            max=dp[i].first;
            maxPos=i;
        }
    }
    vector<int> ans;
    while(maxPos!=-1){
        ans.push_back(A[maxPos]);
        maxPos=dp[maxPos].second;
    }
    reverse(ans.begin(),ans.end());
    return make_pair(max,ans);
}
int main(){
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    int n;
    vector<int> a;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a.push_back(x);
    }
    /*pair<int,vector<int>> res=lis(a);
    cout<<res.first<<"\n";
    for(int i=0;i<res.second.size();i++){
        cout<<res.second[i]<<" ";
    }*/
    vector<int> dp;
    pair<int,int> res=liss(a,dp);
    sol.push_back(a[res.second]);
    buildSol(res.second,a,dp);
    cout<<sol.size()<<"\n";
    for(int i=0;i<sol.size();i++){
        cout<<sol[i]<<" ";
    }
}