Pagini recente » Cod sursa (job #2479062) | Cod sursa (job #2631612) | Cod sursa (job #2711987) | Cod sursa (job #2398372) | Cod sursa (job #931568)
Cod sursa(job #931568)
#include <fstream>
using namespace std;
const int MAX_N = 5002;
int N, Max, Res;
int v[MAX_N], a[MAX_N], b[MAX_N], sol[MAX_N];
int main()
{
ifstream f("subsir2.in");
ofstream g("subsir2.out");
f >> N;
for(int i = 1; i <= N; ++i)
f >> v[i];
a[N] = 1;
for(int i = N-1; i; --i)
{
Max = 0;
for(int j = i + 1; j <= N; ++j)
if(v[i] <= v[j] && a[j] > Max)
Max = a[j];
a[i] = Max + 1;
}
b[1] = 1;
for(int i = 2; i <= N; ++i)
{
Max = 0;
for(int j = 1; j < i; ++j)
if(v[j] <= v[i] && b[j] > Max)
Max = b[j];
b[i] = Max + 1;
}
int p = 1;
Res = a[1] + b[1] - 1;
for(int i = 2; i <= N; ++i)
if(a[i] + b[i] - 1 < Res)
p = i, Res = a[i] + b[i] - 1;
int lp = p;
for(int k = b[p] - 1; k; --k)
{
for(int i = lp - 1; i; --i)
if(b[i] == k && v[i] <= v[lp])
lp = i;
sol[k] = lp;
}
lp = p;
sol[ b[p] ] = p;
int t = b[p];
for(int k = a[p] - 1; k; --k)
{
for(int i = lp + 1; i <= N; ++i)
if(a[i] == k && v[lp] <= v[i])
{
lp = i;
break;
}
sol[++t] = lp;
}
g << Res << '\n';
for(int i = 1; i <= Res; ++i)
g << sol[i] << " ";
g << '\n';
f.close();
g.close();
return 0;
}