Cod sursa(job #413653)

Utilizator dobreDobre Catalin Andrei dobre Data 8 martie 2010 21:17:45
Problema Subsecventa de suma maxima Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>
int i,n;
int *vec,*sol,*best,*p;
FILE* fin,fout;
int max;

void read(char* name)
{
  fin  = fopen(name, "r");

  fscanf(fin, "%d", &n);
  vec = (int*)malloc(sizeof(int) * n);
  best= (int*)malloc(sizeof(int) * n);
  sol = (int*)malloc(sizeof(int) * n);
  p   = (int*)malloc(sizeof(int) * n);
  for (i = 0 ; i < n ; i++)
  {
      fscanf(fin, "%d", &(vec[i]));
      best[i] = 1;
      sol[i]  = 0;
      p[i]    = -1;
  }
  fclose(fin);
}
int solve()
{
  int i,j;
  max = 1;
  for (j = 0 ; j < n ; j++)
    for (i = j ; i < n ; i++)
        if ((vec[i] > vec[j]) && best[i] <= best[j])
        {
          best[i] = 1 + best [j];
          if (best[i] > best[max]) max = i;
          p [i] = j;
        }
  int k = max;
  int count = best[max];
  while (p[k] != -1 )
  {
    sol[count - 1] = vec[k];
    k = p[k];
    count--;
  }
  sol[0] = vec[k];
  return best[max]; // numarul de elemente 
}
void write_sol(char* name, int n)
{
  int i;
  FILE* fout = fopen(name, "w");
  fprintf(fout, "%d\n", n);
  for (i = 0 ; i < n ; i++)
      fprintf(fout,"%d ", sol[i]);
  close(fout);
}
int main(void)
{
  read("scmax.in");
  write_sol("scmax.out", solve());
  return 0;
}