|
| 1 | +int dp[2005][2005][2]; |
| 2 | +class Solution { |
| 3 | +public: |
| 4 | + int find(vector<int> arr,int val){ |
| 5 | + int low=0,high=arr.size()-1,ans=-1; |
| 6 | + while(low<=high){ |
| 7 | + int mid = (low+high)/2; |
| 8 | + if(arr[mid]>val){ |
| 9 | + ans=mid; |
| 10 | + high = mid-1; |
| 11 | + } |
| 12 | + else low = mid+1; |
| 13 | + } |
| 14 | + return ans; |
| 15 | + } |
| 16 | + int ways(vector<int> arr1,vector<int> arr2,int i,int j,int flag){ |
| 17 | + if(i==arr1.size()) return 0; |
| 18 | + else if(j==-1){ |
| 19 | + return min(ways(arr1,arr2,i+1,0,0),1+ways(arr1,arr2,i+1,0,1)); |
| 20 | + } |
| 21 | + if(dp[i][j][flag]==-1){ |
| 22 | + int last_max; |
| 23 | + if(flag==0) last_max = arr1[j]; |
| 24 | + else last_max = arr2[j]; |
| 25 | + int ind = find(arr2,last_max); |
| 26 | + if(ind==-1){ |
| 27 | + if(last_max<arr1[i]) return dp[i][j][flag]=ways(arr1,arr2,i+1,i,0); |
| 28 | + else return dp[i][j][flag]=1e5; |
| 29 | + } |
| 30 | + else{ |
| 31 | + if(last_max<arr1[i]){ |
| 32 | + return dp[i][j][flag]=min(1+ways(arr1,arr2,i+1,ind,1),ways(arr1,arr2,i+1,i,0)); |
| 33 | + } |
| 34 | + else return dp[i][j][flag]=1+ways(arr1,arr2,i+1,ind,1); |
| 35 | + } |
| 36 | + } |
| 37 | + else return dp[i][j][flag]; |
| 38 | + } |
| 39 | + int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) { |
| 40 | + int i,j,k,n,m,ct=0; |
| 41 | + n = arr1.size()-1;m=arr2.size()-1; |
| 42 | + for(i=0;i<n+2;i++){ |
| 43 | + for(j=0;j<m+2;j++) {dp[i][j][0]=-1;dp[i][j][1]=-1;} |
| 44 | + } |
| 45 | + sort(arr2.begin(),arr2.end()); |
| 46 | + k= ways(arr1,arr2,0,-1,0); |
| 47 | + if(k>=1e5) return -1; |
| 48 | + else return k; |
| 49 | + } |
| 50 | +}; |
0 commit comments