Q11 Longest Bitonic subsequence | Practice | GeeksforGeeks
Thu Mar 02 2023 10:06:59 GMT+0000 (Coordinated Universal Time)
Saved by @Ayush_dabas07
//{ Driver Code Starts //Initial Template for Java import java.util.*; import java.lang.*; import java.io.*; class GFG { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine().trim()); while(T-->0) { int n = Integer.parseInt(br.readLine().trim()); String s = br.readLine().trim(); String[] s1 = s.split(" "); int[] nums = new int[n]; for(int i = 0; i < s1.length; i++) nums[i] = Integer.parseInt(s1[i]); Solution ob = new Solution(); int ans = ob.LongestBitonicSequence(nums); System.out.println(ans); } } } // } Driver Code Ends //User function Template for Java class Solution { public int[] LIS(int[] nums ){ int n = nums.length; int dp[] = new int[n]; dp[0] = 1; // for 1 length LIS will be 1 length for(int i = 1 ; i < n ; i++){ for(int j = i-1 ; j>= 0 ; j--){ //finding max in previous smaller elements if(nums[j] < nums[i]) dp[i] = Math.max(dp[i] , dp[j]); } //adding +1 for current element dp[i] +=1; } return dp; } public int[] LDS(int[] nums){ int n = nums.length; int dp[] = new int[n]; dp[n-1] = 1; // for 1 length LDS will be 1 length for(int i = n-2 ; i >=0 ; i--){ for(int j = i+1 ; j< n ; j++){ //finding max in previous smaller elements if(nums[j] < nums[i]) dp[i] = Math.max(dp[i] , dp[j]); } //adding +1 for current element dp[i] +=1; } return dp; } public int LongestBitonicSequence(int[] nums) { /* for LBS we will need LIS and LDS , storage - 2 1D arrays for LIS and LDS meaning - every cell will store LIS ending at that element this is going from left to right every cell will store LDS ending at that element this is going from right to left LDS can be understood as LIS but in reverse array */ int LIS[] = LIS(nums); //for LDS we can find reverse LIS int LDS[] = LDS(nums); //now find max biotonic sequence for every element by LIS+LDS -1 and return max //-1 for the repeated element which exists in both LIS and LDS int ans = 0; for(int i = 0 ; i < nums.length ;i++){ int biotonic = LIS[i] + LDS[i] -1; ans = Math.max(ans , biotonic); } return ans; } }
Comments