Seka {X1 X2 .. Xn} yra kintamoji seka, jei jos elementai atitinka vieną iš šių santykių:
X1< X2 >X3< X4 >X5< …. xn or
X1 > X2< X3 >X4< X5 >…. xn
Pavyzdžiai:
Rekomenduojama praktika Ilgiausia kintamoji poseka Išbandykite!Įvestis: arr[] = {1 5 4}
Išvestis: 3
Paaiškinimas: Visi masyvai yra x1 formos< x2 >x3Įvestis: arr[] = {10 22 9 33 49 50 31 60}
Išvestis: 6
Paaiškinimas: Posekos {10 22 9 33 31 60} arba
{10 22 9 49 31 60} arba {10 22 9 50 31 60}
yra ilgiausia 6 ilgio seka
Pastaba: Ši problema yra pratęsimas ilgiausiai didėjanti sekų problema tačiau reikia daugiau galvoti, norint rasti optimalią pagrindo savybę
Ilgiausia kintama seka naudojant dinaminis programavimas :
Norėdami išspręsti problemą, vadovaukitės toliau pateikta idėja:
Šią problemą išspręsime dinaminio programavimo metodu, nes jis turi optimalią substruktūrą ir persidengiančias subproblemas
pirmasis nešiojamas kompiuteris
Norėdami išspręsti problemą, atlikite toliau nurodytus veiksmus.
- Tegu A duota N ilgio masyvas
- Mes apibrėžiame 2D masyvą las[n][2] taip, kad las[i][0] būtų ilgiausia kintama poseka, kuri baigiasi indeksu i, o paskutinis elementas yra didesnis už ankstesnį elementą
- las[i][1] turi ilgiausią kintamą poseką, kuri baigiasi indeksu i, o paskutinis elementas yra mažesnis už ankstesnį elementą, tada mes turime tokį pasikartojimo ryšį tarp jų
las[i][0] = Ilgiausios kintamos posekos ilgis
baigiasi indeksu i, o paskutinis elementas yra didesnis
nei ankstesnis jo elementaspython konstruktorius[i][1] = Ilgiausios kintamos posekos ilgis
baigiasi indeksu i, o paskutinis elementas yra mažesnis
nei ankstesnis jo elementasRekursinė formulė:
las[i][0] = maks. (las[i][0] las[j][1] + 1);
visiems j< i and A[j] < A[i]las[i][1] = maks. (las[i][1] las[j][0] + 1);
visiems j< i and A[j] >A[i]
- Pirmasis pasikartojimo ryšys yra pagrįstas tuo, kad jei mes esame i padėtyje ir šis elementas turi būti didesnis už ankstesnį elementą, tada, kad ši seka (iki i) būtų didesnė, bandysime pasirinkti elementą j (< i) such that A[j] < A[i] i.e. A[j] can become A[i]’s previous element and las[j][1] + 1 is bigger than las[i][0] then we will update las[i][0].
- Atminkite, kad pasirinkome las[j][1] + 1, o ne las[j][0] + 1, kad patenkintume alternatyvią ypatybę, nes paskutinis elementas las[j][0] yra didesnis nei ankstesnis, o A[i] yra didesnis nei A[j], o tai sulaužys kintamąją savybę, jei atnaujinsime. Taigi aukščiau pateiktas faktas išveda pirmąjį pasikartojimo ryšį, panašų argumentą galima pateikti ir dėl antrojo pasikartojimo ryšio.
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++// C++ program to find longest alternating // subsequence in an array #include using namespace std; // Function to return max of two numbers int max(int a int b) { return (a > b) ? a : b; } // Function to return longest alternating // subsequence length int zzis(int arr[] int n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ int las[n][2]; // Initialize all values from 1 for (int i = 0; i < n; i++) las[i][0] = las[i][1] = 1; // Initialize result int res = 1; // Compute values in bottom up manner for (int i = 1; i < n; i++) { // Consider all elements as // previous of arr[i] for (int j = 0; j < i; j++) { // If arr[i] is greater then // check with las[j][1] if (arr[j] < arr[i] && las[i][0] < las[j][1] + 1) las[i][0] = las[j][1] + 1; // If arr[i] is smaller then // check with las[j][0] if (arr[j] > arr[i] && las[i][1] < las[j][0] + 1) las[i][1] = las[j][0] + 1; } // Pick maximum of both values at index i if (res < max(las[i][0] las[i][1])) res = max(las[i][0] las[i][1]); } return res; } // Driver code int main() { int arr[] = { 10 22 9 33 49 50 31 60 }; int n = sizeof(arr) / sizeof(arr[0]); cout << 'Length of Longest alternating ' << 'subsequence is ' << zzis(arr n); return 0; } // This code is contributed by shivanisinghss2110
C // C program to find longest alternating subsequence in // an array #include #include // function to return max of two numbers int max(int a int b) { return (a > b) ? a : b; } // Function to return longest alternating subsequence length int zzis(int arr[] int n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ int las[n][2]; /* Initialize all values from 1 */ for (int i = 0; i < n; i++) las[i][0] = las[i][1] = 1; int res = 1; // Initialize result /* Compute values in bottom up manner */ for (int i = 1; i < n; i++) { // Consider all elements as previous of arr[i] for (int j = 0; j < i; j++) { // If arr[i] is greater then check with // las[j][1] if (arr[j] < arr[i] && las[i][0] < las[j][1] + 1) las[i][0] = las[j][1] + 1; // If arr[i] is smaller then check with // las[j][0] if (arr[j] > arr[i] && las[i][1] < las[j][0] + 1) las[i][1] = las[j][0] + 1; } /* Pick maximum of both values at index i */ if (res < max(las[i][0] las[i][1])) res = max(las[i][0] las[i][1]); } return res; } /* Driver code */ int main() { int arr[] = { 10 22 9 33 49 50 31 60 }; int n = sizeof(arr) / sizeof(arr[0]); printf( 'Length of Longest alternating subsequence is %dn' zzis(arr n)); return 0; }
Java // Java program to find longest // alternating subsequence in an array import java.io.*; class GFG { // Function to return longest // alternating subsequence length static int zzis(int arr[] int n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ int las[][] = new int[n][2]; /* Initialize all values from 1 */ for (int i = 0; i < n; i++) las[i][0] = las[i][1] = 1; int res = 1; // Initialize result /* Compute values in bottom up manner */ for (int i = 1; i < n; i++) { // Consider all elements as // previous of arr[i] for (int j = 0; j < i; j++) { // If arr[i] is greater then // check with las[j][1] if (arr[j] < arr[i] && las[i][0] < las[j][1] + 1) las[i][0] = las[j][1] + 1; // If arr[i] is smaller then // check with las[j][0] if (arr[j] > arr[i] && las[i][1] < las[j][0] + 1) las[i][1] = las[j][0] + 1; } /* Pick maximum of both values at index i */ if (res < Math.max(las[i][0] las[i][1])) res = Math.max(las[i][0] las[i][1]); } return res; } /* Driver code*/ public static void main(String[] args) { int arr[] = { 10 22 9 33 49 50 31 60 }; int n = arr.length; System.out.println('Length of Longest ' + 'alternating subsequence is ' + zzis(arr n)); } } // This code is contributed by Prerna Saini
Python3 # Python3 program to find longest # alternating subsequence in an array # Function to return max of two numbers def Max(a b): if a > b: return a else: return b # Function to return longest alternating # subsequence length def zzis(arr n): '''las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element''' las = [[0 for i in range(2)] for j in range(n)] # Initialize all values from 1 for i in range(n): las[i][0] las[i][1] = 1 1 # Initialize result res = 1 # Compute values in bottom up manner for i in range(1 n): # Consider all elements as # previous of arr[i] for j in range(0 i): # If arr[i] is greater then # check with las[j][1] if (arr[j] < arr[i] and las[i][0] < las[j][1] + 1): las[i][0] = las[j][1] + 1 # If arr[i] is smaller then # check with las[j][0] if(arr[j] > arr[i] and las[i][1] < las[j][0] + 1): las[i][1] = las[j][0] + 1 # Pick maximum of both values at index i if (res < max(las[i][0] las[i][1])): res = max(las[i][0] las[i][1]) return res # Driver Code arr = [10 22 9 33 49 50 31 60] n = len(arr) print('Length of Longest alternating subsequence is' zzis(arr n)) # This code is contributed by divyesh072019
C# // C# program to find longest // alternating subsequence // in an array using System; class GFG { // Function to return longest // alternating subsequence length static int zzis(int[] arr int n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ int[ ] las = new int[n 2]; /* Initialize all values from 1 */ for (int i = 0; i < n; i++) las[i 0] = las[i 1] = 1; // Initialize result int res = 1; /* Compute values in bottom up manner */ for (int i = 1; i < n; i++) { // Consider all elements as // previous of arr[i] for (int j = 0; j < i; j++) { // If arr[i] is greater then // check with las[j][1] if (arr[j] < arr[i] && las[i 0] < las[j 1] + 1) las[i 0] = las[j 1] + 1; // If arr[i] is smaller then // check with las[j][0] if (arr[j] > arr[i] && las[i 1] < las[j 0] + 1) las[i 1] = las[j 0] + 1; } /* Pick maximum of both values at index i */ if (res < Math.Max(las[i 0] las[i 1])) res = Math.Max(las[i 0] las[i 1]); } return res; } // Driver Code public static void Main() { int[] arr = { 10 22 9 33 49 50 31 60 }; int n = arr.Length; Console.WriteLine('Length of Longest ' + 'alternating subsequence is ' + zzis(arr n)); } } // This code is contributed by anuj_67.
PHP // PHP program to find longest // alternating subsequence in // an array // Function to return longest // alternating subsequence length function zzis($arr $n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ $las = array(array()); /* Initialize all values from 1 */ for ( $i = 0; $i < $n; $i++) $las[$i][0] = $las[$i][1] = 1; $res = 1; // Initialize result /* Compute values in bottom up manner */ for ( $i = 1; $i < $n; $i++) { // Consider all elements // as previous of arr[i] for ($j = 0; $j < $i; $j++) { // If arr[i] is greater then // check with las[j][1] if ($arr[$j] < $arr[$i] and $las[$i][0] < $las[$j][1] + 1) $las[$i][0] = $las[$j][1] + 1; // If arr[i] is smaller then // check with las[j][0] if($arr[$j] > $arr[$i] and $las[$i][1] < $las[$j][0] + 1) $las[$i][1] = $las[$j][0] + 1; } /* Pick maximum of both values at index i */ if ($res < max($las[$i][0] $las[$i][1])) $res = max($las[$i][0] $las[$i][1]); } return $res; } // Driver Code $arr = array(10 22 9 33 49 50 31 60 ); $n = count($arr); echo 'Length of Longest alternating ' . 'subsequence is ' zzis($arr $n) ; // This code is contributed by anuj_67. ?> JavaScript <script> // Javascript program to find longest // alternating subsequence in an array // Function to return longest // alternating subsequence length function zzis(arr n) { /*las[i][0] = Length of the longest alternating subsequence ending at index i and last element is greater than its previous element las[i][1] = Length of the longest alternating subsequence ending at index i and last element is smaller than its previous element */ let las = new Array(n); for (let i = 0; i < n; i++) { las[i] = new Array(2); for (let j = 0; j < 2; j++) { las[i][j] = 0; } } /* Initialize all values from 1 */ for (let i = 0; i < n; i++) las[i][0] = las[i][1] = 1; let res = 1; // Initialize result /* Compute values in bottom up manner */ for (let i = 1; i < n; i++) { // Consider all elements as // previous of arr[i] for (let j = 0; j < i; j++) { // If arr[i] is greater then // check with las[j][1] if (arr[j] < arr[i] && las[i][0] < las[j][1] + 1) las[i][0] = las[j][1] + 1; // If arr[i] is smaller then // check with las[j][0] if( arr[j] > arr[i] && las[i][1] < las[j][0] + 1) las[i][1] = las[j][0] + 1; } /* Pick maximum of both values at index i */ if (res < Math.max(las[i][0] las[i][1])) res = Math.max(las[i][0] las[i][1]); } return res; } let arr = [ 10 22 9 33 49 50 31 60 ]; let n = arr.length; document.write('Length of Longest '+ 'alternating subsequence is ' + zzis(arr n)); // This code is contributed by rameshtravel07. </script>
Išvestis
Length of Longest alternating subsequence is 6
Laiko sudėtingumas: O (N2)
Pagalbinė erdvė: O(N), nes buvo užimta N papildomos vietos
Efektyvus požiūris: Norėdami išspręsti problemą, vadovaukitės toliau pateikta idėja:
Taikydami aukščiau pateiktą metodą, bet kuriuo momentu stebime dvi kiekvieno masyvo elemento reikšmes (ilgiausios kintamos posekos ilgis, pasibaigiantis indeksu i, o paskutinis elementas yra mažesnis arba didesnis nei ankstesnis elementas). Norėdami optimizuoti erdvę, turime išsaugoti tik du elemento kintamuosius bet kuriame indekse i
inc = iki šiol ilgiausios alternatyvios posekos ilgis, kai dabartinė vertė yra didesnė už ankstesnę vertę.
dec = iki šiol ilgiausios alternatyvios posekos ilgis, kai dabartinė vertė yra mažesnė už ankstesnę vertę.
Sudėtinga šio metodo dalis yra atnaujinti šias dvi vertes.python rstrip„inc“ turėtų būti padidintas tada ir tik tada, jei paskutinis elementas alternatyvioje sekoje buvo mažesnis nei ankstesnis elementas.
„dec“ turėtų būti padidintas tada ir tik tada, jei paskutinis elementas alternatyvioje sekoje buvo didesnis nei ankstesnis elementas.
Norėdami išspręsti problemą, atlikite toliau nurodytus veiksmus.
- Paskelbkite, kad du sveikieji skaičiai inc ir dec lygūs vienam
- Vykdykite kilpą i [1 N-1]
- Jei arr[i] yra didesnis nei ankstesnis elementas, nustatykite inc lygų dec + 1
- Kitu atveju, jei arr[i] yra mažesnis nei ankstesnis elementas, nustatykite dec lygų inc + 1
- Grąžinimo maksimumas padidinimo ir sumažėjimo
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++// C++ program for above approach #include using namespace std; // Function for finding // longest alternating // subsequence int LAS(int arr[] int n) { // 'inc' and 'dec' initialized as 1 // as single element is still LAS int inc = 1; int dec = 1; // Iterate from second element for (int i = 1; i < n; i++) { if (arr[i] > arr[i - 1]) { // 'inc' changes if 'dec' // changes inc = dec + 1; } else if (arr[i] < arr[i - 1]) { // 'dec' changes if 'inc' // changes dec = inc + 1; } } // Return the maximum length return max(inc dec); } // Driver Code int main() { int arr[] = { 10 22 9 33 49 50 31 60 }; int n = sizeof(arr) / sizeof(arr[0]); // Function Call cout << LAS(arr n) << endl; return 0; }
Java // Java Program for above approach public class GFG { // Function for finding // longest alternating // subsequence static int LAS(int[] arr int n) { // 'inc' and 'dec' initialized as 1 // as single element is still LAS int inc = 1; int dec = 1; // Iterate from second element for (int i = 1; i < n; i++) { if (arr[i] > arr[i - 1]) { // 'inc' changes if 'dec' // changes inc = dec + 1; } else if (arr[i] < arr[i - 1]) { // 'dec' changes if 'inc' // changes dec = inc + 1; } } // Return the maximum length return Math.max(inc dec); } // Driver Code public static void main(String[] args) { int[] arr = { 10 22 9 33 49 50 31 60 }; int n = arr.length; // Function Call System.out.println(LAS(arr n)); } }
Python3 # Python3 program for above approach def LAS(arr n): # 'inc' and 'dec' initialized as 1 # as single element is still LAS inc = 1 dec = 1 # Iterate from second element for i in range(1 n): if (arr[i] > arr[i-1]): # 'inc' changes if 'dec' # changes inc = dec + 1 elif (arr[i] < arr[i-1]): # 'dec' changes if 'inc' # changes dec = inc + 1 # Return the maximum length return max(inc dec) # Driver Code if __name__ == '__main__': arr = [10 22 9 33 49 50 31 60] n = len(arr) # Function Call print(LAS(arr n))
C# // C# program for above approach using System; class GFG { // Function for finding // longest alternating // subsequence static int LAS(int[] arr int n) { // 'inc' and 'dec' initialized as 1 // as single element is still LAS int inc = 1; int dec = 1; // Iterate from second element for (int i = 1; i < n; i++) { if (arr[i] > arr[i - 1]) { // 'inc' changes if 'dec' // changes inc = dec + 1; } else if (arr[i] < arr[i - 1]) { // 'dec' changes if 'inc' // changes dec = inc + 1; } } // Return the maximum length return Math.Max(inc dec); } // Driver code static void Main() { int[] arr = { 10 22 9 33 49 50 31 60 }; int n = arr.Length; // Function Call Console.WriteLine(LAS(arr n)); } } // This code is contributed by divyeshrabadiya07
JavaScript <script> // Javascript program for above approach // Function for finding // longest alternating // subsequence function LAS(arr n) { // 'inc' and 'dec' initialized as 1 // as single element is still LAS let inc = 1; let dec = 1; // Iterate from second element for (let i = 1; i < n; i++) { if (arr[i] > arr[i - 1]) { // 'inc' changes if 'dec' // changes inc = dec + 1; } else if (arr[i] < arr[i - 1]) { // 'dec' changes if 'inc' // changes dec = inc + 1; } } // Return the maximum length return Math.max(inc dec); } let arr = [ 10 22 9 33 49 50 31 60 ]; let n = arr.length; // Function Call document.write(LAS(arr n)); // This code is contributed by mukesh07. </script>
Išvestis:
6
Laiko sudėtingumas: O(N)
Pagalbinė erdvė: O(1)
Sukurti viktoriną