Trang chủ Tin Học Lớp 12 Cho dãy số nguyên A = a1, a2, ..., an....

Cho dãy số nguyên A = a1, a2, ..., an. (n < 5000, -10000 < a; <10000). Một dãy con của A là một cách chọn ra trong A một số phần tử giữ nguyên thứ tự. Như

Câu hỏi :

Bài này làm sao? Giúp mình với

image

Lời giải 1 :

const 

   InputFile = 'INCSEQ.INP'; 

   OutputFile = 'INCSEQ.OUT'; 

   max = 5000; 

 

var 

   a, L, T: array[0..max + 1] of Integer; 

   n: Word; 

 

procedure Enter; 

var 

   i: Word; 

   f: Text; 

begin 

   Assign(f, InputFile); Reset(f); 

   ReadLn(f, n); 

   for i := 1 to n do Read(f, a[i]); 

   Close(f); 

end; 

 

procedure Optimize;

var 

  i, j, jmax: Word; 

begin 

   a[0] := -32768; a[n + 1] := 32767; {Thêm hai phần tử canh hai đầu dãy a}

   L[n + 1] := 1; {Điền cơ sở quy hoach động vào bảng phương án}

   for i := n downto 0 do {Tính bảng phương án}

   begin 

{Chọn trong các chỉ số j đứng sau i thoả mãn aj > ai ra chỉ số jmax có L[jmax] lớn nhất} 

     jmax := n + 1; 

     for j := i + 1 to n + 1 do 

         if (a[j] > a[i]) and (L[j] > L[jmax])

             then jmax := j; 

         L[i] := L[jmax] + 1; {Lưu độ dài dãy con tăng dài nhất bắt đầu tại ai}

        T[i] := jmax; {Lưu vết: phần tử đứng liền sau ai trong dãy con tăng dài nhất đó là ajmax}

     end;

end; 

 

procedure Result; 

var 

   f: Text; 

   i: Integer; 

begin 

  Assign(f, OutputFile); Rewrite(f); 

  WriteLn(f, L[0] - 2); {Chiều dài dãy con tăng dài nhất}

   i := T[0]; {Bắt đầu truy vết tìm nghiệm}

  while i <> n + 1 do 

     begin 

         WriteLn(f, 'a[', i, '] = ', a[i]); 

         i := T[i]; 

     end; 

  Close(f); 

end; 

 

begin 

   Enter; 

   Optimize; 

   Result; 

end.

Thảo luận

Lời giải 2 :

*Bài này dùng quy hoạch động

uses crt;
var f:text; i,j,n:longint; a,l,t:array[0..10000000]of longint;
begin
clrscr;
   assign(f,'INCSEQ.INP');reset(f);
      readln(f,n);
      for i:=1 to n do read(f,a[i]);
   close(f);
   assign(f,'INCSEQ.OUT');rewrite(f);
      a[0]:=low(longint);
      for i:=n downto 0 do
         begin
            l[i]:=1;
            for j:=i+1 to n do
               if (l[j]+1>l[i])and(a[i]<a[j]) then
                  begin l[i]:=l[j]+1; t[i]:=j; end;
         end;
      writeln(f,l[0]-1);
      i:=t[0];
      while i<>0 do
         begin
            writeln(f,'a[',i,'] = ',a[i]);
            i:=t[i];
         end;
   close(f);
end.

Bảng phương án:

image

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng (ảo). Với cách hiểu hiện nay, tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 12

Lớp 12 - Năm cuối ở cấp tiểu học, năm học quan trọng nhất trong đời học sinh trải qua bao năm học tập, bao nhiêu kì vọng của người thân xung quanh ta. Những nỗi lo về thi đại học và định hướng tương lai thật là nặng. Hãy tin vào bản thân là mình sẽ làm được rồi tương lai mới chờ đợi các em!

Nguồn : ADMIN :))

Liên hệ hợp tác hoặc quảng cáo: gmail

Điều khoản dịch vụ

Copyright © 2021 HOCTAPSGK