Cod sursa(job #799461)

Utilizator andreitaleanuAndrei Taleanu andreitaleanu Data 19 octombrie 2012 00:11:44
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAX 100000

int scmax(int *v, int n, int *poz)
{
     int i, j, best[MAX], max, last_seq_len = 1, last_seq_index = 0, best_seq_index = 0;
     
     best[0] = 1;
     for (i = 1; i < n; i++)
     {   
         if (v[i] < v[i-1])
         {  /* elementele sunt in ordine incorecta --> actualizez lungimea maxima crescatoare */
            best[i] = best[i-1];
            last_seq_len = 1;
            last_seq_index = i;
         }
         else
         {   /* elementele sunt in ordinea buna --> calculez cel mai lung subsir crescator pana acum */
             last_seq_len++;
             for (j = last_seq_index, max = 0; j < i; j++)
                 if (max < best[j])
                    max = best[j];
             if (max < last_seq_len) { best[i] = last_seq_len; best_seq_index = last_seq_index; } else best[i] = max;
         }
     }
     
     for (i = 0; i < n; i++)
         printf("%3i", best[i]);
     printf("\n");
     
     for (i = best_seq_index; i < best[n-1] + best_seq_index; i++)
         printf("%3i", v[i]);
     printf("\n");
     
     return max;
}

int main()
{
    FILE *f, *g;
    int n, v[MAX], i, max, p;
    
    f = fopen("scmax.in", "r");
    
    fscanf(f, "%i", &n);
    for (i = 0; i < n; ++i)
        fscanf(f, "%i", v+i);
    
//    for (i = 0; i < n; i++)
//        printf("v[%i] = %i\n", i, v[i]);
    
    g = fopen("scmax.out", "w");
    max = scmax(v, n, &p);
//    fprintf(g, "%i\n", max);
//    for (i = p - max + 1; max > 0; i++, max--)
//        fprintf(g, "%i ", v[i]);
    
    getch();
    return 0;
}