Pagini recente » Cod sursa (job #1596471) | Cod sursa (job #316944) | Cod sursa (job #2283887) | Cod sursa (job #971875) | Cod sursa (job #2022915)
//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]){
buildSol(i,a,dp);
sol.push_back(a[i]);
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);
buildSol(res.second,a,dp);
sol.push_back(a[res.second]);
cout<<sol.size()<<"\n";
for(int i=0;i<sol.size();i++){
cout<<sol[i]<<" ";
}
}