Advertisement
AnhVan1712

Day Con Tăng Dài Nhất

Jun 2nd, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | None | 0 0
  1. #include <stdio.h>
  2. void nhap(int n, int A[]);
  3. void xuat(int n, int A[]);
  4. int xuLy(int n, int A[], int L[], int cacVTLonHon[], int mangKQ[]);
  5. int timVTLonHonMax(int cacVTLonHon[], int k);
  6. int truyMangTangDan(int n, int A[], int L[], int mangKQ[]);
  7. int timVTMaxCuaMang(int k, int L[]);
  8. int main()
  9. {
  10.     int n;
  11.     printf("Nhap so luong phan tu cua mang !\n");
  12.     scanf("%d", &n);
  13.     int* A = new int[n + 2];
  14.     int* L = new int[n + 2];
  15.     int* cacVTLonHon = new int[n + 2];
  16.     int* mangKQ = new int[n];
  17.     nhap(n, A);
  18.     int doDaiMangTangDan = xuLy(n, A, L, cacVTLonHon, mangKQ);
  19.     xuat(doDaiMangTangDan, mangKQ);
  20.     delete[]A;
  21.     delete[]L;
  22.     delete[] cacVTLonHon;
  23.     delete[] mangKQ;
  24.     return 0;
  25. }
  26. int timVTMaxCuaMangL(int k, int L[])
  27. {
  28.     int VT = 0;
  29.     for (int i = 0; i < k; i++)
  30.     {
  31.         if (L[i] > L[VT])
  32.         {
  33.             VT = i;
  34.         }
  35.     }
  36.     return VT;
  37. }
  38. int truyMangTangDan(int n, int A[], int L[], int mangKQ[])
  39. {
  40.     int dem = 0;
  41.     int VT = timVTMaxCuaMangL(n + 2, L);
  42.     int i = VT;
  43.     int j;
  44.     do
  45.     {
  46.         for (j = i; j < n + 1; j++)
  47.         {
  48.             if (L[i] == (L[j] + 1) && (A[i] <= A[j]))
  49.             {
  50.                 mangKQ[dem++] = A[j];
  51.                 break;
  52.             }
  53.         }
  54.         i = j;
  55.     } while (i != n + 1);
  56.     return dem;
  57. }
  58. int xuLy(int n, int A[], int L[], int cacVTLonHon[], int mangKQ[])
  59. {
  60.     L[n + 1] = 1;
  61.     L[n] = 2;
  62.     int k = 0;
  63.     for (int i = n - 1; i >= 0; i--)
  64.     {
  65.         for (int j = i+1; j < n + 2; j++)
  66.         {
  67.             if (A[i] <= A[j])
  68.             {
  69.                 cacVTLonHon[k++]=L[j];
  70.             }
  71.         }
  72.         int VT = timVTLonHonMax(cacVTLonHon, k);
  73.         L[i] = VT + 1;
  74.         k = 0;
  75.     }
  76.     return truyMangTangDan(n, A, L, mangKQ);
  77. }
  78. int timVTLonHonMax(int cacVTLonHon[], int k)
  79. {
  80.     int max = cacVTLonHon[0];
  81.     for (int i = 0; i < k; i++)
  82.     {
  83.         if (max < cacVTLonHon[i])
  84.         {
  85.             max = cacVTLonHon[i];
  86.         }
  87.     }
  88.     return max;
  89. }
  90. void nhap(int n, int A[])
  91. {
  92.     A[0] = -100000000;
  93.     A[n + 1] = 100000000;
  94.     for (int i = 1; i <= n; i++)
  95.     {
  96.         scanf("%d", &A[i]);
  97.     }
  98. }
  99. void xuat(int n, int A[])
  100. {
  101.     printf("Do dai cua mang tang dan dai nhat la : %d\n", n);
  102.     for (int i = 0; i < n; i++)
  103.     {
  104.         printf("%d ", A[i]);
  105.     }
  106.     printf ("\n");
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement