Trang chủ Tin Học Lớp 11 . DẴY ĐƠN ĐIỆU TĂNG DÀI NHẤT Cho dãy số...

. DẴY ĐƠN ĐIỆU TĂNG DÀI NHẤT Cho dãy số nguyên dương a = (a1, a2, ..., an) (1  n  10000; 1  ai  10000) Hãy tìm dãy chỉ số dài nhất i1, i2, ..., ik¬ thoả mã

Câu hỏi :

. DẴY ĐƠN ĐIỆU TĂNG DÀI NHẤT Cho dãy số nguyên dương a = (a1, a2, ..., an) (1  n  10000; 1  ai  10000) Hãy tìm dãy chỉ số dài nhất i1, i2, ..., ik¬ thoả mãn: • 1  i1

Lời giải 1 :

var a,nho,luu:array[0..10000] of word;
i,j,n,nho1:word;
max:word;
f1,f2:text;
const fi='INCSEQ.INP';
fo='INCSEQ.OUT';
procedure luukq;
var j1:word;
begin
    for j1:=1 to max do
      begin
         luu[j1]:=nho[j1];
      end;
end;
procedure try(i,dem:word);
var i1,j1:word;
begin
  if i<=n then
    for i1:=i to n do
       if a[i1]>nho[dem-1] then
         begin
           nho[dem]:=a[i1];
           try(i1+1,dem+1);
           if dem>max then
              begin
                  max:=dem;
                  luukq;
              end;
         end;
end;
begin
    assign(f1,fi);reset(f1);
    assign(f2,fo);rewrite(f2);
    repeat
        readln(f1,n);
    until (1<=n) and (n<=10000);
    fillchar(nho,sizeof(nho),0);
    for i:=1 to n do read(f1,a[i]);
    max:=0;
    try(1,1);
    writeln(f2,max);
    for i:=1 to max do write(f2,luu[i],' ');
    close(f1);close(f2);
end.

Thảo luận

-- học đệ quy quay lui thì chắc sẽ hiểu xd
-- thủ tục luukq sao mình ko thấy sử dụng hè
-- sử dụng ở trong thủ tục đệ quy quay lui try r :v
-- ok
-- 54

Lời giải 2 :

Program DayDonSDieuTangDayNhat;

Uses crt;

const
  max = 6000;
var
  a, l, t, StartOf: array[0..max + 1] of Integer;
  n, m: Integer;
procedure Nhap;
var
  i: Word;
  fi, fo: Text;
begin
  Assign(fi, 'INCSEQ.INP');
  Reset(fi);
  ReadLn(fi, n);
  for i := 1 to n do Read(fi, a[i]);
  Close(fi);
end;

procedure Init;
begin
  a[0] := -32768;
  a[n + 1] := 32767;
  m := 1;
  L[n + 1] := 1;
  StartOf[1] := n + 1;
end;
function Find(i: Integer): Integer;
var
  inf, sup, median, j: Integer;
begin
  inf := 1;
  sup := m + 1;
  repeat
  median := (inf + sup) div 2;
  j := StartOf[median];
  if a[j] > a[i] then inf := median 
  else sup := median;
  until inf + 1 = sup;
  Find := StartOf[inf];
end;

procedure Optimize;
var
  i, j, k: Integer;
begin
  for i := n downto 0 do
    begin
      j := Find(i);
      k := L[j] + 1;
      if k > m then
        begin
          m := k;
          StartOf[k] := i;
        end
      else
        if a[StartOf[k]] < a[i] then StartOf[k] := i;
      L[i] := k;
      T[i] := j;
    end;
end;

procedure Result;
var
  f: Text;
  i: Integer;
begin
  Assign(fo, 'INCSEQ.OUT');
  Rewrite(fo);
  WriteLn(fo, m - 2);
  i := T[0];
  while i <> n + 1 do
    begin
      WriteLn(fo, 'a[', i, '] = ', a[i]);
      i := T[i];
    end;
  Close(fo);
end;
begin
  Nhap;
  Init;
  Optimize;
  Result;
end.

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ự 11

Lớp 11 - Năm thứ hai ở cấp trung học phổ thông, gần đến năm cuối cấp nên học tập là nhiệm vụ quan trọng nhất. Nghe nhiều đến định hướng sau này rồi học đại học. Ôi nhiều lúc thật là sợ, hoang mang nhưng các em hãy tự tin và tìm dần điều mà mình muốn là trong tương lai nhé!

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