Repository: skm2000/Dynamic-Programming Branch: master Commit: 0b46b8fcc947 Files: 92 Total size: 67.8 KB Directory structure: gitextract_p1x2cpzs/ ├── .gitignore ├── 3_segment.cpp ├── Best_Time_To_Buy_And_Sell_Stock_.cpp ├── BitonicSequence.cpp ├── Box_Stacking_Problem.cpp ├── Circular_Kadene.cpp ├── Coin_Changing_1.cpp ├── Coin_Changing_2.cpp ├── Count_All_Increasing_Subsequences.cpp ├── Count_All_Pallindromic_Subsequence.cpp ├── Count_Distinct_Subsequences.cpp ├── Count_Number_of_hops.cpp ├── Count_Pallindromic_SubString_Of_String_gfg.cpp ├── Count_Subsets_of_given_Sum.cpp ├── Count_ways_to_N'th_Stair.cpp ├── Diameter_Of_Binary_Tree.cpp ├── Distinct_Occurences.cpp ├── Edit_Distance.cpp ├── Equal_Sum_Partition.cpp ├── Friends_Pairing_Problem.cpp ├── Get_Minimum_Squares.cpp ├── GoldMine_Problem.cpp ├── Jump_Game_3.cpp ├── Jump_Game_5.cpp ├── Kadane.cpp ├── Knapsack_0_1.cpp ├── Last_Stone_3.cpp ├── Longest_Common_Subsequence.cpp ├── Longest_Common_Substring.cpp ├── Longest_Consequetive_Subsequence.cpp ├── Longest_Decreasing_Subsequence.cpp ├── Longest_Increasing_Subsequence.cpp ├── Longest_Pallindromic_Subsequence.cpp ├── Longest_Pallindromic_Substring.cpp ├── Longest_Repeating_Subsequence.cpp ├── Matrix_Chain_Multiplication.cpp ├── Max_Path_Sum_in_Triangle.cpp ├── Max_path_sum.cpp ├── Maximize_the_cutting.cpp ├── Maximum_Dot_Product_Subsequence.cpp ├── Maximum_Path_Sum_in_Binary_tree.cpp ├── Maximum_Product_Increasing_Subsequence.cpp ├── Maximum_Size_Submatrix_Square.cpp ├── Maximum_Sum_Decreasing_Subsequence.cpp ├── Maximum_Sum_Dividing_Recurssive.cpp ├── Maximum_Sum_Increasing_Subsequence.cpp ├── Maximum_length_of_pairs.cpp ├── Minimum_Ascii_Sum_deletion_To_Make_two_Strings_equal.cpp ├── Minimum_Initial_Points_To_Reach_Destinaion.cpp ├── Minimum_Jumps_To_Reach_End.cpp ├── Minimum_Subset_Sum_Difference.cpp ├── Minm_Cost_To_Fill_Bag.cpp ├── Minm_Deletion_To_Make_Pallindrome.cpp ├── Minm_Insertion_Deletion_Convert.cpp ├── No_Of_Ways_To_Tile.cpp ├── Number_of_ways_to_decode_a_string.cpp ├── Optimal_Strategy_To_Play_A_Game.cpp ├── Path_In_A_Matrix.cpp ├── Print_Longest_Common_Subsequence.cpp ├── Procuct_of_array_except_self.cpp ├── README.md ├── Reach_a_given_score.cpp ├── Rod_Cutting.cpp ├── Russian_Doll_Envelope.cpp ├── Shortest_Common_Supersequence.cpp ├── SubsetSum.cpp ├── Tiling_Problem.cpp ├── Unbounded_Knapsack.cpp ├── Uncrossed_Lines.cpp ├── count_submatrices_with_all_ones.cpp ├── count_subsets_of_given_difference.cpp ├── flip_game_1.cpp ├── flip_game_2.cpp ├── jump_game_2..cpp ├── longest_alternating_subsequence.cpp ├── maximal_square.cpp ├── maximum_product_subarray.cpp ├── maximum_sum_submatrix.cpp ├── minm_number_of_taps_to_open_water.cpp ├── nim_game.cpp ├── nth_catlan_number.cpp ├── num_products.cpp ├── number_of_permutations_such_that_no_three_forms_increasing_sequence.cpp ├── number_of_valid_parenthesis.cpp ├── spoj/ │ ├── ABA12C - Buying Apples!.cpp │ ├── ACODE - Alphacode.cpp │ ├── AIBOHP - Aibohphobia.cpp │ └── ANARC09A - Seinfeld.cpp ├── unique_paths_1.cpp ├── unique_paths_2.cpp ├── video_stiching.cpp └── zerosAndOnes.cpp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ a.out ================================================ FILE: 3_segment.cpp ================================================ #include using namespace std; // question link // https://codeforces.com/problemset/problem/987/C int main() { #define int long long int n; cin>>n; vectors(n + 1), rent(n + 1); for(int i = 1 ; i <= n ;i++) { cin>>s[i]; } for(int i = 1 ; i <= n ;i ++) { cin>>rent[i]; } vector>dp(n+1, vector(4, INT_MAX)); for(int i = 1 ; i <= n; i++) { dp[i][1] = rent[i]; } for(int k = 2 ; k <= 3 ;k++) { for(int i = 1 ; i <= n; i ++) { for(int j = 1 ; j < i ; j++) { if(s[j] < s[i]) { dp[i][k] = min(dp[i][k], dp[j][k-1] + rent[i]); } } } } int ans = INT_MAX; for(int i = 1 ; i <= n ;i++) { if(dp[i][3] != INT_MAX) { ans = min(ans, dp[i][3]); } } if(ans!=INT_MAX) cout< using namespace std; //A very beautiful problem with a tweak of Kadane's algorithm. int best_time(vector&arr,int n){ vectordiff(n,0); for(int i=1;i>n; vectorarr(n); for(int i=0;i>arr[i]; } cout< using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; vectorv(n+1,0); for(int i=0;i>v[i]; } vectorLis(n+1,1); vectorLds(n+1,1); // cal longest increasing sequence for(int i=0;i=0;j--) { if(v[j]=0;i--) { for(int j = i+1;j using namespace std; struct Box{ int h; int d; int w; }; bool comparator(Box b1, Box b2){ return (b1.d*b1.w)>(b2.d*b2.w); } int maxStackHeight(int h[],int d[],int w[],int n){ struct Box ini[n]; for(int i=0;i using namespace std; int maxMoney(int arr[], int num) { int max_far=arr[0],max_curr=arr[0],min_far=arr[0],min_curr=arr[0],total=arr[0]; for(int i=1;i0){ return max(max_far,total-min_far); } else{ return max_far; } } ================================================ FILE: Coin_Changing_1.cpp ================================================ #include using namespace std; int Max_ways(int coins[],int size,int sum){ int dp[size+1][sum+1]; for(int i=0;i<=sum;i++){ dp[0][i]=0; } for(int i=0;i<=size;i++){ dp[i][0]=1; } for(int i=1;i<=size;i++){ for(int j=1;j<=sum;j++){ if(coins[i-1]<=j){ dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]]; } else{ dp[i][j] = dp[i-1][j]; } } } for(int i=0;i<=size;i++){ for(int j=0;j<=sum;j++){ cout< using namespace std; int Minm_Coins(int coins[],int size,int sum) { int dp[size+1][sum+1]; for(int i=0;i<=sum;i++){ dp[0][i] = INT_MAX - 1; } for(int i=1;i<=size;i++){ dp[i][0] = 0; } for(int i=1;i<=size;i++){ for(int j=1;j<=sum;j++){ if(coins[i-1]<=j){ dp[i][j] = min(dp[i-1][j],1+dp[i][j-coins[i-1]]); } else{ dp[i][j] = dp[i-1][j]; } } } return dp[size][sum]; } int main(){ int coins[] = {1,6,5,2,8}; int sum = 11; int size = sizeof(coins)/sizeof(coins[0]); cout< using namespace std; //O(n^2) solution int Count_AIS(int a[],int size){ int dp[size],ans=0; for(int i=0;ia[j]){ dp[i]+=dp[j]; } } } for(int i=0;i=0;j--){//max 10 times count[a[i]]+=count[j]; } count[a[i]]++; } for(int i=0;i<10;i++){ ans+=count[i]; } return ans; } int main(){ int a[]={3,2,4,5,4}; int size=sizeof(a)/sizeof(a[0]); cout< using namespace std; int CountLPS(string s){ int n = s.length(); int dp[n][n]; memset(dp,0,sizeof(dp)); for(int i=0;i=0;i--){ for(int j=i+1;j #define MAX_CHAR 256 using namespace std; int CDS(string s,int size){ vectorlast_char(MAX_CHAR,-1); int dp[size+1]; dp[0]=1; for(int i=1;i<=size;i++){ dp[i] = 2*dp[i-1]; if(last_char[s[i-1]]!=-1){ dp[i]=dp[i]-dp[last_char[s[i-1]]]; } last_char[s[i-1]]=(i-1); } return dp[size]; } int main(){ string s="gfg"; int size=s.length(); cout< using namespace std; void solve(int n){ int dp[n]; dp[1]=1,dp[2]=2,dp[3]=4; for(int i=4;i<=n;i++){ dp[i]=dp[i-1]+dp[i-2]+dp[i-3]; } cout<>t; while(t--){ int n; cin>>n; solve(n); } return 0; } ================================================ FILE: Count_Pallindromic_SubString_Of_String_gfg.cpp ================================================ #include using namespace std; int expandAroundCenter(string s,int left,int right){ if(s.length()==0 || left>right) return 0; int ans=0; while(left>=0 && right>t; while(t--){ int n; cin>>n; string s; cin>>s; cout< using namespace std; int CountSubsets(int a[],int size,int sum) { int dp[size+1][sum+1]; for(int i=0;i<=sum;i++){ dp[0][i] = 0; } for(int i=0;i<=size;i++){ dp[i][0]=1; } for(int i=1;i<=size;i++){ for(int j=1;j<=sum;j++){ if(a[i-1]<=j){ dp[i][j] = dp[i-1][j] + dp[i-1][j-a[i-1]]; } else { dp[i][j] = dp[i-1][j]; } } } for(int i=0;i<=size;i++){ for(int j=0;j<=sum;j++){ cout<left,res); int right=helper(node->right,res); int tempAns=1+max(left,right); int ans=max(tempAns,1+left+right); res=max(res,ans); return tempAns; } int diameter(Node* node) { int res=INT_MIN; helper(node,res); return res; } ================================================ FILE: Distinct_Occurences.cpp ================================================ #include using namespace std; int Count_All_Distinct_Occurences(string s1,string s2){ int n=s1.length(),m=s2.length(); if(m>n) return 0; int dp[n+1][m+1]; for(int i=0;i<=m;i++) dp[0][i]=0; for(int i=0;i<=n;i++) dp[i][0]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s1[i-1]==s2[j-1]){ dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; } else{ dp[i][j] = dp[i-1][j]; } } } for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ cout<>t; while(t--){ string s1,s2; cin>>s1>>s2; cout< using namespace std; int Edit_Distance(string s1,string s2){ int m = s1.length(); int n = s2.length(); int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0) dp[i][j] = j; else if(j==0) dp[i][j] = i; else if(s1[i-1] == s2[j-1]){ dp[i][j] = dp[i-1][j-1]; } else{ dp[i][j] = 1 + min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1])); } } } for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ cout< using namespace std; bool EqualSubsetSum(int a[],int size) { int sum=0; for(int i=0;i #define m 1000000007 using namespace std; int main() { int t; cin>>t; while(t--){ int n; cin>>n; long long int dp[n+1]; for(int i=0;i<=n;i++){ if(i<=2) dp[i]=i; else{ dp[i]=((dp[i-1]%m)+((i-1)%m*(dp[i-2]%m))%m)%m; } } cout< using namespace std; int getMinimumSquares(int n){ int dp[n+1]; dp[0]=0; dp[1]=1; dp[2]=2; dp[3]=3; for(int i=4;i<=n;i++){ dp[i]=i;//marking with the maximum for(int p=1;p<=ceil(sqrt(i));p++){//maximum it can go is ceil(sqrt(n) int temp=p*p; if(temp>i) break; dp[i]=min(dp[i],1+dp[i-temp]); } } return dp[n]; } int main(){ int t; cin>>t; while(t--){ int n; cin>>n; cout< using namespace std; int main(){ int t; cin>>t; while(t--){ int m,n; cin>>n>>m; int gold[n][m]; for(int i=0;i>gold[i][j]; } } int dp[n][m]; int right,right_up,right_down; memset(dp,0,sizeof(dp)); for(int i=m-1;i>=0;i--){ for(int j=0;j& arr, int start) { int N = arr.size(); vector tab(N, 0); return help(arr, start, tab, N); } bool help(vector& arr, int start, vector& tab, int N) { if ((start < 0 || start > N - 1) || tab[start] == 1) { return false; } if (arr[start] == 0) { return true; } tab[start] = 1; if (help(arr, start-arr[start], tab, N)) { return true; } if (help(arr, start+arr[start], tab, N)) { return true; } return false; } }; ================================================ FILE: Jump_Game_5.cpp ================================================ #include using namespace std; //LEETCODE QUESTION int dp[1001]; int helper(vector& arr,int d,int i){ if(dp[i]!=-1) return dp[i]; int ans=1,n=arr.size(); //right for(int j=i+1;j<=min(n-1,i+d)&&arr[i]>arr[j];j++)ans=max(ans,1+helper(arr,d,j)); //left for(int j=i-1;j>=max(0,i-d)&&arr[i]>arr[j];j--)ans=max(ans,1+helper(arr,d,j)); return dp[i]=ans; } int maxJumps(vector& arr, int d) { int ans=1; for(int i=0;i using namespace std; int Kadane(int a[],int size){ int max_cur=a[0],max_far=a[0]; for(int i=1;i using namespace std; int knapsack(int wt[],int val[],int W,int size){ int dp[size+1][W+1]; for(int i=0;i<=size;i++){ for(int j=0;j<=W;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(wt[i-1]<=j){ dp[i][j] = max(dp[i-1][j],val[i-1] + dp[i-1][j-wt[i-1]]); } else{ dp[i][j] = dp[i-1][j]; } } } return dp[size][W]; } int main() { int val[] = {60, 100, 120}; int wt[] = {10, 20, 30}; int W = 50; int size = sizeof(val)/sizeof(val[0]); cout< using namespace std; //Leetcode Question //Recurssion base soln int helper(vector& s,int i){ if(i>=s.size()) return 0; else{ int ans=INT_MIN; ans=max(ans,s[i]-helper(s,i+1)); if(i+1& s) { int ans=helper(s,0); if(ans<0) return "Bob"; else if(ans==0) return "Tie"; return "Alice"; } //Memonization based soln int dp[500001]; int helper(vector&s,int i){ if(i>=s.size()) return 0; if(dp[i]!=-1) return dp[i]; else{ int ans=INT_MIN; ans=max(ans,s[i]-helper(s,i+1)); if(i+1& s) { for(int i=0;i& s) { int n=s.size(); vectordp(n+1,0); int i=n-1; while(i>=0){ int ans=INT_MIN; ans=max(ans,s[i]-dp[i+1]); if(i+1 using namespace std; int Lcs(string s1,string s2){ int m = s1.length(),n = s2.length(); int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0) dp[i][j]=0; else if(s1[i-1] == s2[j-1]){ dp[i][j] = 1 + dp[i-1][j-1]; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ cout< using namespace std; int LCSub(string s1,string s2){ int m = s1.length(),n = s2.length(); int dp[m+1][n+1],res=0; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(s1[i-1] == s2[j-1]){ dp[i][j] = 1 + dp[i-1][j-1]; res = max(res,dp[i][j]); } else{ dp[i][j] = 0; } } } return res; } int main(){ string s1 = "abcdgl"; string s2 = "abedgl"; cout< using namespace std; int main() { int t; cin>>t; while(t--){ int n; cin>>n; int m[100001]={0}; int a[n]; for(int i=0;i>a[i]; for(int i=0;i=1)count++; else count=0; res=max(res,count); } cout< using namespace std; int LDS(int a[],int size){ int dp[size+1],res=1; for(int i=0;i=0;i--){ for(int j=0;ja[j]){ dp[i] = max(dp[i],1+dp[j]); } } res = max(res,dp[i]); } return res; } int main(){ int a[] = {10,9,2,5,3,7,101,18}; int size = sizeof(a)/sizeof(a[0]); cout< using namespace std; int LIS(int a[],int size){ int dp[size+1],res=1; for(int i=0;ia[j]){ dp[i] = max(dp[i],1+dp[j]); } } res = max(res,dp[i]); } return res; } int main(){ int a[] = {10,9,2,5,3,7,101,18}; int size = sizeof(a)/sizeof(a[0]); reverse(a,a+size); cout< using namespace std; //used bottom-up aproach(but similar to lcs) int longestPalindromeSubseq(string s) { int n=s.length(); int dp[n+1][n+1]; for(int i=0;i=0;i--){ for(int j=i+1;j using namespace std; int expandAroundCenter(string s,int left,int right){ if(s.length()==0 || left>right) return 0; while(left>=0 && rightend-start){ start=i-(len-1)/2; end=i+len/2; } } return s.substr(start,end-start+1); } int main(){ string s = "helppreanadkada"; cout< using namespace std; int LRS(string s){ int n = s.length(); int dp[n+1][n+1]; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(s[i-1] == s[j-1] && i!=j){ dp[i][j] = 1 + dp[i-1][j-1]; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } return dp[n][n]; } int main() { string s = "aabebcdd"; cout< using namespace std; int dp[5][5]; int MCM(int a[],int i,int j){ if(i>=j) return 0; if(dp[i][j] != -1) return dp[i][j]; int ans = INT_MAX,temp_ans; for(int k=i;k #define N 4 using namespace std; int Max_Sum_Tri(int t[][N],int m,int n){ for(int i=m-2;i>=0;i--){ for(int j=0;j<=i;j++){ t[i][j] = max(t[i+1][j],t[i+1][j+1])+t[i][j]; } } return t[0][0]; } int main(){ int t[N][N] = { {3,0,0,0}, {7,4,0,0}, {2,4,6,0}, {8,5,9,3} }; cout< using namespace std; vectorv(100,0); vectordp(100,0); vectoradj[100]; int largest_sum(int child,int parent) { dp[child] = v[child]; int max_val = 0; for(auto ch : adj[child]) { if(ch==parent)continue; largest_sum(ch,child); max_val = max(max_val, dp[ch]); } return dp[child] += max_val; } int main() { int n; cin>>n; cout<<"Enter the nodes value\n"; for(int i=1;i<=n;i++) { cin>>v[i]; } for(int i=0;i>a>>b; adj[a].push_back(b); adj[b].push_back(a); } cout< using namespace std; int main() { int t; cin>>t; while(t--){ int n,x,y,z; cin>>n; cin>>x>>y>>z; int dp[n+1]; for(int i=0;i<=n;i++) dp[i]=-1; dp[0]=0; for(int i=0;i<=n;i++){ if(dp[i]==-1) continue; if(i+x<=n){ dp[i+x]=max(dp[i+x],dp[i]+1); } if(i+y<=n){ dp[i+y]=max(dp[i+y],dp[i]+1); } if(i+z<=n){ dp[i+z]=max(dp[i+z],dp[i]+1); } } for(int i=0;i<=n;i++){ cout< using namespace std; int maxDotProduct(vector& A, vector& B,int size1,int size2) { vector>dp(size1,vector(size2)); for(int i=0;i=1 && j>=1) dp[i][j] = dp[i][j]+max(dp[i-1][j-1],0); if(i>=1) dp[i][j] = max(dp[i][j],dp[i-1][j]); if(j>=1) dp[i][j] = max(dp[i][j],dp[i][j-1]); } } return dp[size1-1][size2-1]; } int main(){ int size1,size2; cin>>size1>>size2; vectorA(size1); vectorB(size2); for(int i=0;i>A[i]; } for(int i=0;i>B[i]; } cout<& nums1, vector& nums2) { int n = int(nums1.size()), m = int(nums2.size()); vector> dp(n + 1, vector(m + 1, INT_MIN)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { dp[i][j] = max(dp[i][j], dp[i - 1][j]); dp[i][j] = max(dp[i][j], dp[i][j - 1]); dp[i][j] = max(dp[i][j], dp[i - 1][j - 1]); dp[i][j] = max(dp[i][j], max(dp[i - 1][j - 1], 0) + nums1[i - 1] * nums2[j - 1]); } } return dp[n][m]; } }; ================================================ FILE: Maximum_Path_Sum_in_Binary_tree.cpp ================================================ //Only function Written class Solution { int maxToRoot(TreeNode *root, int &re) { if (!root) return 0; int l = maxToRoot(root->left, re); int r = maxToRoot(root->right, re); if (l < 0) l = 0; if (r < 0) r = 0; re=max(re,l+r+root->val); return root->val += max(l, r); } public: int maxPathSum(TreeNode *root) { int re = -2147483648; maxToRoot(root, re); return re; } }; ================================================ FILE: Maximum_Product_Increasing_Subsequence.cpp ================================================ #include using namespace std; int MPIS(int a[],int size){ int dp[size]; for(int i=0;ia[j] && dp[i]<(a[i]*dp[j])){ dp[i] = a[i]*dp[j]; } } } int max = dp[0]; for(int i=1;imax){ max = dp[i]; } } return max; } int main(){ int a[] = { 3, 100, 4, 5, 150, 6 }; int size = sizeof(a)/sizeof(a[0]); cout< #define r 6 #define c 5 using namespace std; int Max_Square(int M[r][c]){ int dp[r][c],ans=0; for(int i=0;i using namespace std; int MSDS(int a[],int size){ int dp[size]; for(int i=0;ia[j] && dp[i]max){ max = dp[i]; } } return max; } int main(){ int a[] = {1, 101, 2, 3, 100, 4, 5}; int size = sizeof(a)/sizeof(a[0]); reverse(a,a+size); cout< using namespace std; int main() { int t; cin>>t; while(t--){ int n; cin>>n; int dp[n+1]; dp[0]=0,dp[1]=1; for(int i=2;i<=n;i++){ dp[i]=max(dp[i/2]+dp[i/3]+dp[i/4],i); } cout< using namespace std; int MSIS(int a[],int size){ int dp[size]; for(int i=0;ia[j] && dp[i]max){ max = dp[i]; } } return max; } int main(){ int a[] = {1, 101, 2, 3, 100, 4, 5}; int size = sizeof(a)/sizeof(a[0]); cout<>& pairs) { int n=pairs.size(); int dp[n+1],res=1; sort(pairs.begin(),pairs.end()); for(int i=0;ipairs[j][1]){ dp[i]=max(dp[i],1+dp[j]); } } res=max(res,dp[i]); } if(n==0)return 0; else return res; } ================================================ FILE: Minimum_Ascii_Sum_deletion_To_Make_two_Strings_equal.cpp ================================================ #include using namespace std; int minimumDeleteSum(string s1, string s2) { int m=s1.length(),n=s2.length(); int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ dp[i][j]=0; } } for(int i=1;i<=m;i++){ dp[i][0]=dp[i-1][0]+s1[i-1]; } for(int j=1;j<=n;j++){ dp[0][j]=dp[0][j-1]+s2[j-1]; } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(s1[i-1]==s2[j-1]){ dp[i][j]=dp[i-1][j-1]; } else{ dp[i][j]=min(dp[i-1][j]+s1[i-1],dp[i][j-1]+s2[j-1]); } } } for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ cout< using namespace std; const int maxm=100000; int a[3][3]; int r=3,c=3; //One of the best problems come across. int MinmIniPoints(int a[][3]){ int dp[r+1]; for(int i=0;i<=r;i++){ dp[i]=INT_MAX; } dp[r-1]=1; for(int j=c-1;j>=0;j--){ for(int i=r-1;i>=0;i--){ dp[i]=min(dp[i],dp[i+1])-a[i][j]; dp[i]=max(1,dp[i]); } } return dp[0]; } int main(){ int a[3][3] = { {-2,-3,3}, {-5,-10,1}, {10,30,-5} }; cout< using namespace std; //o(n^2) int Min_Jumps(int a[],int size){ int dp[size]; dp[0] = 0; for(int i=1;i=maxReach) return -1; step=maxReach-i; } } return -1; } int main(){ int a[] = { 1, 3, 6, 1, 0, 9 }; int size = sizeof(a) / sizeof(a[0]); cout< using namespace std; int Minm_SubsetSum_Diff(int a[],int size){ int sum = 0; for(int i=0;i=0;i--){ if(dp[size][i]==1){ diff = sum-2*i; break; } } return diff; } int main(){ int a[] = {3, 1, 4, 2, 2, 1}; int size = sizeof(a)/sizeof(a[0]); cout< #include #define INF 1000000 using namespace std; int minm_Cost(int cost[],int n,int W){ vectorval,wt; int size=0; for(int i=0;i>t; while(t--){ int n,W; cin>>n>>W; int cost[n]; for(int i=0;i>cost[i]; } cout< using namespace std; int DelPallin(string s){ int n = s.length(),lps; int dp[n+1][n+1]; for(int i=0;i=0;i--){ for(int j=i+1;j using namespace std; int Idconvert(string s1,string s2){ int m = s1.length(),n=s2.length(),lcs; int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(s1[i-1] == s2[j-1]){ dp[i][j] = 1 + dp[i-1][j-1]; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } lcs = dp[m][n]; cout<<"Minimum Insertions : "< using namespace std; int main() { int t; cin>>t; while(t--){ int n; cin>>n; long long int dp[n+1]; dp[0]=0; for(int i=1;i<=n;i++){ if(i<=3) dp[i]=1; else if (i==4) dp[i]=2; else dp[i] = dp[i-1]+dp[i-4]; } cout< using namespace std; // similar to fibonacci int countWays(string s){ int n = s.length(); int dp[n+1]; for(int i=0;i '0'){ dp[i] = dp[i-1]; } if(s[i-2] == '1' || (s[i-2] == '2' && s[i-1] <= '7')){ dp[i] += dp[i-2]; } } return dp[n]; } int main(){ string s; cin>>s; cout< #define N 5 using namespace std; int dp[N][N]; int OptimalStrategy(int coins[],int i,int j){ //Base Cases if(i==j) return coins[i]; if(i==j+1) return max(coins[i],coins[j]); if(dp[i][j]==0){ //Taking from the start int start = coins[i] + min(OptimalStrategy(coins,i+2,j),OptimalStrategy(coins,i+1,j-1)); //Taking from end int end = coins[j] + min(OptimalStrategy(coins,i,j-2),OptimalStrategy(coins,i+1,j-1)); //maximum of both dp[i][j] = max(start,end); } return dp[i][j]; } int main(){ } ================================================ FILE: Path_In_A_Matrix.cpp ================================================ #include using namespace std; int cost[1000][1000]; void solve(int n,int cost[][1000]){ int dp[n][n]; memset(dp,0,sizeof(dp)); for(int i=n-1;i>=0;i--){ for(int j=n-1;j>=0;j--){ int down=(i==n-1)?0:dp[i+1][j]; int down_left=(i==n-1 || j==0)?0:dp[i+1][j-1]; int down_right=(i==n-1 || j==n-1)?0:dp[i+1][j+1]; dp[i][j]= cost[i][j]+max(down,max(down_right,down_left)); } } int ans=dp[0][0]; for(int i=1;i>t; while(t--){ int n; cin>>n; for(int i=0;i>cost[i][j]; } } solve(n,cost); } } ================================================ FILE: Print_Longest_Common_Subsequence.cpp ================================================ #include using namespace std; string PrintLcs(string s1,string s2){ int m = s1.length(),n = s2.length(); int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0) dp[i][j]=0; else if(s1[i-1] == s2[j-1]){ dp[i][j] = 1 + dp[i-1][j-1]; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } int i=m,j=n; string ans=""; while(i>0 && j>0){ if(s1[i-1] == s2[j-1]){ ans.push_back(s1[i-1]); i--; j--; } else if(dp[i][j-1]>dp[i-1][j]){ j--; } else{ i--; } } reverse(ans.begin(),ans.end()); return ans; } int main(){ string s1 = "abcdgl"; string s2 = "abedfhl"; cout< productExceptSelf(vector& nums) { int n = nums.size(); vectorleft(n+1,1); vectorright(n+1,1); left[0] = nums[0]; right[n-1] = nums[n - 1 ]; for(int i = 1;i= 0 ; i--) { right[i] = right[i+1] * nums[i]; } vectorans(n); for(int i = 0;i 0 and i< n -1 ) { ans[i] = left[i - 1] * right[i + 1]; } } return ans; } }; ================================================ FILE: README.md ================================================ # Dynamic-Programming A DP a day keeps the bug away. **Cointains Dp Problems**

**Parent Problem** : [*Kadane's Algorithm*](/Kadane.cpp)
1) [Best Time to Buy and sell Stock(Leetcode)](/Best_Time_To_Buy_And_Sell_Stock_.cpp)
2) [Circular Kadane](/Circular_Kadene.cpp)
**Parent Problem** : *Fibonacci*.
SubProblems :
1) [Reach a given Score](/Reach_a_given_score.cpp).
2) [Count number of hops](/Count_Number_of_hops.cpp).
3) [Count ways to reach n-th stair](/Count_ways_to_N'th_Stair.cpp).
4) [Count Number of Ways to Tile](/No_Of_Ways_To_Tile.cpp).
5) [Tiling Problem-General](/Tiling_Problem.cpp).
6) [Maximum Sum Dividing](/Maximum_Sum_Dividing_Recurssive.cpp).
7) [Friends Pairing Problem](/Friends_Pairing_Problem.cpp)
8) [Maximize the Cutting](/Maximize_the_cutting.cpp)
9) [Number of Ways to Decode a String](/Number_of_ways_to_decode_a_string.cpp) **Parent Problem** : [*0/1 KnapSack Problem*](/Knapsack_0_1.cpp)
SubProblems :
1) [SubSet Sum](/SubsetSum.cpp).
2) [Equal Sum Partition](/Equal_Sum_Partition.cpp).
3) [Count of SubSet Sum]().
4) [Minimum SubSet Sum Difference](/Minimum_Subset_Sum_Difference.cpp).
5) [Count SubSets of given Sum](/Count_Subsets_of_given_Sum.cpp).

**Parent Problem** : [*Unbounded KnapSack*](/Unbounded_Knapsack.cpp)
SubProblems :
1) [Coin Changing Problem 1(No of ways)](/Coin_Changing_1.cpp).
2) [Coin Changing Problem 2(Minimum no of coins)](/Coin_Changing_2.cpp).
3) [Rod Cutting Problem](/Rod_Cutting.cpp).
4) [Minimum Cost to Fill Bag](/Minm_Cost_To_Fill_Bag.cpp).

**Parent Problem** : [*Longest Common SubSequence*](/Longest_Common_Subsequence.cpp)
SubProblems :
1) [Longest Common SubString](/Longest_Common_Substring.cpp).
2) [Shortest Common SuperSequence](/Shortest_Common_Supersequence.cpp).
3) [Print LCS](/Print_Longest_Common_Subsequence.cpp).
4) [Minimum Insertions And Deletion to Convert a String](/Minm_Insertion_Deletion_Convert.cpp).
5) [Longest Repeating SubSequence](/Longest_Repeating_Subsequence.cpp).
6) [Longest Pallindromic SubSequence](/Longest_Pallindromic_Subsequence.cpp).
7) [Edit Distance](/Edit_Distance.cpp).
8) [Count All Pallindromic SubSequence](/Count_All_Pallindromic_Subsequence.cpp).
9) [Minimum Deletion to make string pallindrome](/Minm_Deletion_To_Make_Pallindrome.cpp).
10) [Count Distinct Occcurences](/Distinct_Occurences.cpp).
11) [Maximum length of pairs](/Maximum_length_of_pairs.cpp).
12) [Minimum Ascii Sum deletion To Make two Strings equal](/Minimum_Ascii_Sum_deletion_To_Make_two_Strings_equal.cpp).
13) [Maximum Dot Product of Subsequences(Leetcode)](/Maximum_Dot_Product_Subsequence.cpp).
14) [Uncrossed Lines(LeetCode)](/Uncrossed_Lines.cpp).

**Parent Problem** : [*Longest Increasing Subsequence*](/Longest_Increasing_Subsequence.cpp)
1) [Russian Doll Envelope(Leetcode)](/Russian_Doll_Envelope.cpp).
2) [Longest Decreasing SubSequence](/Longest_Decreasing_Subsequence.cpp).
3) [Maximum Sum Increasing SubSequence](/Maximum_Sum_Increasing_Subsequence.cpp).
4) [Maximum Sum Decreasing SubSequence](/Maximum_Sum_Decreasing_Subsequence.cpp).
5) [Maximum Product Increasing Subsequence](/Maximum_Product_Increasing_Subsequence.cpp).
6) [Minimum Jumps to reach end](/Minimum_Jumps_To_Reach_End.cpp).
7) [Box Stacking Problem](/Box_Stacking_Problem.cpp).
8) [Longest Bitonic Sequence](/BitonicSequence.cpp).
9) [Longest Alternating Subsequence](/longest_alternating_subsequence.cpp)
10) [Count All Increasing Subsequences](/Count_All_Increasing_Subsequences.cpp).
**Parent Problem** : *DP + Greedy*
1) [Jump Game-2(Leetcode)](/jump_game_2..cpp).
2) [Video Stiching(Leetcode)](/video_stiching.cpp).
3) [Minm number of taps to open water](/minm_number_of_taps_to_open_water.cpp).
**Parent Problem** : *Game(DP) + minimax*
1) [Nim Game](/nim_game.cpp).
2) [Flip Game-1](/flip_game.cpp).
3) [Flip Game-2](/flip_game2.cpp).
4) [Get Minimum Squares](/Get_Minimum_Squares.cpp).
5) [Optimal Strategy to play a Game](/Optimal_Strategy_To_Play_A_Game.cpp).
6) [Stone Game-3](/Last_Stone_3.cpp)
7) [Jump Game-3(Leetcode)](/Jump_Game_3.cpp)
8) [Jump Game-5(Leetcode)](/Jump_Game_5.cpp)
**Parent Problem** : *Dp on Grids*
1) [Maximum Size Submatrix Square](/Maximum_Size_Submatrix_Square.cpp).
2) [Maximum Path Sum in Triangle](/Max_Path_Sum_in_Triangle.cpp).
3) [Minimum Initial Points to Reach Destination](/Minimum_Initial_Points_To_Reach_Destinaion.cpp).
4) [GoldMine Problem](/GoldMine_Problem.cpp)
5) [Path in a Matrix](/Max_path_sum.cpp)
6) [Maximal Square(Leetcode)](/maximal_square.cpp)
7) [Count Submatrices with all ones(Leetcode)](/count_submatrices_with_all_ones.cpp)
8) [Maximum Sum Submatrix](/maximum_sum_submatrix.cpp)
9) [Unique Path-1](/unique_paths_1.cpp)
10) [Unique Path-2](/unique_paths_2.cpp)
**Parent Problem** : [*Matrix Chain Multiplication*](/Matrix_Chain_Multiplication.cpp)
**Parent Problem** : [*Count Distinct SubSequences*](/Count_Distinct_Subsequences.cpp)
**Parent Problem** : *Dp on Trees*
1) [Max Path Sum](/Max_path_sum.cpp)
2) [Maximum Path Sum in a Tree from Any node to any other node](/Maximum_Path_Sum_in_Binary_tree.cpp)
3) [Diameter of a Binary Tree](/Diameter_Of_Binary_Tree.cpp)
**Others** 1) [Longest Consequetive Subsequences](/Longest_Consequetive_Subsequence.cpp).
2) [Zeroes And Ones](/zerosAndOnes.cpp) 3) [Longest Pallidromic SubString](/Longest_Pallindromic_Substring.cpp).
4) [Count Pallindromic substring of string](/Count_Pallindromic_SubString_Of_String_gfg.cpp)
5) [Product of array except self](/Count_Pallindromic_SubString_Of_String_gfg.cpp) Happy Coding!! ================================================ FILE: Reach_a_given_score.cpp ================================================ #include using namespace std; void solve(int sum){ int dp[sum+1]={0}; dp[0]=1; for(int i=3;i<=sum;i++) dp[i]+=dp[i-3]; for(int i=5;i<=sum;i++) dp[i]+=dp[i-5]; for(int i=10;i<=sum;i++) dp[i]+=dp[i-10]; cout<>t; while(t--){ int sum; cin>>sum; solve(sum); } return 0; } //similar to coin changing ================================================ FILE: Rod_Cutting.cpp ================================================ #include using namespace std; int rodCutting(int cost[],int len[],int size) { int dp[size+1][size+1]; for(int i=0;i<=size;i++){ for(int j=0;j<=size;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(len[i-1]<=j){ dp[i][j] = max(dp[i-1][j],cost[i-1] + dp[i][j-len[i-1]]); } else{ dp[i][j] = dp[i-1][j]; } } } for(int i=0;i<=size;i++){ for(int j=0;j<=size;j++){ cout< using namespace std; // Problem Statement : https://leetcode.com/problems/russian-doll-envelopes/ //Similar to LIS with a tweak. int maxEnvelopes(vector>& envelopes) { sort(envelopes.begin(),envelopes.end()); int n=envelopes.size(),res=1; vectordp(n,1); for(int i=1;ienvelopes[j][0] && envelopes[i][1]>envelopes[j][1]){ dp[i] = max(dp[i],1+dp[j]); } } res = max(res,dp[i]); } if(n==0) return 0; else return res; } ================================================ FILE: Shortest_Common_Supersequence.cpp ================================================ #include using namespace std; int Scs(string s1,string s2){ int m = s1.length(),n=s2.length(),lcs; int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(s1[i-1] == s2[j-1]){ dp[i][j] = 1 + dp[i-1][j-1]; } else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } lcs = dp[m][n]; return m+n-lcs; } int main(){ string s1 = "abcdgl"; string s2 = "abedfhl"; cout< using namespace std; bool SubsetSum(int a[],int size,int sum) { bool dp[size+1][sum+1]; for(int i=0;i<=sum;i++){ dp[0][i] = false; } for(int i=0;i<=size;i++){ dp[i][0]=true; } for(int i=1;i<=size;i++){ for(int j=1;j<=sum;j++){ if(a[i-1] <= j) { dp[i][j] = dp[i-1][j] || dp[i-1][j-a[i-1]]; } else { dp[i][j] = dp[i-1][j]; } } } return dp[size][sum]; } int main() { int a[] = {3, 34, 4, 12, 5, 2}; int sum = 1; int size = sizeof(a)/sizeof a[0]; cout< using namespace std; int CountWays(int n, int m) { int dp[n + 1]; dp[0] = 0; for (int i = 1; i <= n; i++) { if (i > m) dp[i] = dp[i - 1] + dp[i - m]; else if (i < m) dp[i] = 1; else dp[i] = 2; } return dp[n]; } int main() { int n = 7, m = 4; cout << "Number of ways = " << CountWays(n, m); return 0; } ================================================ FILE: Unbounded_Knapsack.cpp ================================================ #include using namespace std; int knapsack(int wt[],int val[],int W,int size){ int dp[size+1][W+1]; for(int i=0;i<=size;i++){ for(int j=0;j<=W;j++){ if(i==0 || j==0){ dp[i][j] = 0; } else if(wt[i-1]<=j){ dp[i][j] = max(dp[i-1][j],val[i-1] + dp[i][j-wt[i-1]]); } else{ dp[i][j] = dp[i-1][j]; } } } for(int i=0;i<=size;i++){ for(int j=0;j<=W;j++){ cout< using namespace std; int maxUncrossedLines(vector& A, vector& B,int n,int m) { vector>dp(m+1,vector(n+1,0)); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(A[i-1]==B[j-1]){ dp[i][j] = 1+dp[i-1][j-1]; } else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } return dp[m][n]; } int main(){ int m,n; cin>>m>>n; vectorA(m),B(n); for(int i=0;i>A[i]; } for(int i=0;i>B[i]; } cout< using namespace std; // problem : https://leetcode.com/problems/count-square-submatrices-with-all-ones class Solution { public: int countSquares(vector>& m) { if(m.empty()) return 0; int sum=0; int dp[m.size()][m[0].size()]; for(int i=0;i using namespace std; // given an array a difference of subset.find the count of that difference // approach ----------------> s1 + s2 = sum(arr) --eqn1 && s1-s2 = diff(given) ---eqn2; // solve eqn1 & eqn2 find s1 . s1 = (sum+diff)/2 // therefore the problem reduces to count number of subset of with sum s1 int count(vector &nums,int sum) { int n = nums.size(); vector>dp(n+1,vector(sum+1,0)); for(int i=0;i<=sum;i++){ dp[0][i] = 0; } for(int i=0;i<=n;i++){ dp[i][0] = 1; } for(int i=1;i<=n;i++){ for(int j=1;j<=sum;j++){ if(nums[i-1] <= j){ dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i-1]]; } else{ dp[i][j] = dp[i-1][j]; } } } return dp[n][sum]; } int main() { int n,diff,sum=0; cin>>n>>diff; vectornums(n); for(int i=0;i>nums[i]; sum += nums[i]; } int s1 = (sum+diff)/2; cout< using namespace std; // problem : https://www.lintcode.com/problem/flip-game/ class Solution { public: vector generatePossibleNextMoves(string &s) { // write your code here int n=s.length(); vectorans; for(int i=0;i using namespace std; // problem : https://www.lintcode.com/problem/flip-game-ii/ // very good question class Solution { public: bool canWin(string &s) { // write your code here if(s.length()<2) return false; return flipGame(s); } bool flipGame(string &s){ for(int i=0;i using namespace std; // problem : https://leetcode.com/problems/jump-game-ii/ // dp+greedy(range-based) class Solution { public: int jump(vector& nums) { int pos=0,des=0,jump=0; for(int i=0;i using namespace std; // problem : https://leetcode.com/problems/wiggle-subsequence // O(n^2) time and o(n) space class Solution { public: int wiggleMaxLength(vector& nums) { int n=nums.size(); if(n == 0) return 0; // up[i] refers to the length of the longest wiggle subsequence obtained so far considering ith element vectorup(n,1),down(n,1); for(int i=1;i nums[j]){ up[i] = max(up[i],1+down[j]); } else if(nums[i] < nums[j]){ down[i] = max(down[i],1+up[j]); } } } return max(up[n-1],down[n-1]); } }; // O(n) time and O(n) space class Solution { public: int wiggleMaxLength(vector& nums) { int n=nums.size(); if(n == 0) return 0; // up[i] refers to the length of the longest wiggle subsequence obtained so far considering ith element vectorup(n,1),down(n,1); for(int i=1;i nums[i-1]){ up[i] = 1+down[i-1]; down[i] = down[i-1]; } else if(nums[i] < nums[i-1]){ down[i] = 1+up[i-1]; up[i] = up[i-1]; } else{ down[i] = down[i-1]; up[i] = up[i-1]; } } return max(up[n-1],down[n-1]); } }; // O(n) ime and O(1) space class Solution { public: int wiggleMaxLength(vector& nums) { int n=nums.size(); if(n == 0) return 0; int up=1,down=1; for(int i=1;i nums[i-1]){ up = down+1; } else if(nums[i] < nums[i-1]){ down = up+1; } } return max(up,down); } }; ================================================ FILE: maximal_square.cpp ================================================ #include using namespace std; // problem : https://leetcode.com/problems/maximal-square/ class Solution { public: int maximalSquare(vector>& matrix) { if(matrix.empty()) return 0; int res=0; vector>m(matrix.size(),vector(matrix[0].size())); for(int i=0;i using namespace std; // problem : https://leetcode.com/problems/maximum-product-subarray/ class Solution { public: int maxProduct(vector& nums) { // almost similar to kadane int n=nums.size(),maxPro=1,minPro=1,best=INT_MIN; for(int i=0;i using namespace std; // problem : https://www.interviewbit.com/problems/maximum-sum-square-submatrix/ // very beautiful question int Solution::solve(vector > &A, int B) { int r = A.size(),c=A[0].size(); vector>dp(r+1,vector(c+1,0)); for(int i=1;i=0 && j-B >= 0){ sum = max(sum,dp[i][j]-dp[i-B][j]-dp[i][j-B]+dp[i-B][j-B]); } } } return sum; } ================================================ FILE: minm_number_of_taps_to_open_water.cpp ================================================ #include using namespace std; // problem : https://leetcode.com/problems/minimum-number-of-taps-to-open-to-water-a-garden/ class Solution { public: int minTaps(int n, vector& ranges) { int minm=0; int maxm=0; int open=0; while(maxm < n){ for(int i=0;imaxm){ maxm = r; } } if(minm == maxm) return -1; minm = maxm; open++; } return open; } }; ================================================ FILE: nim_game.cpp ================================================ #include using namespace std; // problem : https://leetcode.com/problems/nim-game // n > 10^9 won't work, O(n) solution class Solution { public: bool canWinNim(int n) { if(n <= 3) return true; bool dp[n+1]; dp[0]=false; dp[1]=true,dp[2]=true,dp[3]=true; for(int i=4;i<=n;i++){ dp[i] = !(dp[i-1] && dp[i-2] && dp[i-3]); } return dp[n]; } }; // O(1) solution class Solution { public: bool canWinNim(int n) { return !(n%4 == 0); } }; ================================================ FILE: nth_catlan_number.cpp ================================================ #include using namespace std; // O(n^2) approach; int nCatlan(int n) { vectordp(n,0); dp[0] = dp[1] = 1; for(int i=2;i<=n;i++){ for(int j=0;j n-r) r = n-r; for(int i=0;i> n; cout< using namespace std; vectord[2005]; void divisors() { for(int i = 1 ; i <= 2005 ; i++) { if(i != 1)d[i].push_back(1); for(int j = 2 ; j * j <= i ; j++) { if(i % j == 0) { d[i].push_back(j); if(i/j != j) d[i].push_back(i/j); } } } } int main() { #define int long long int n; cin>>n; vectora(n); for(int i = 0 ; i < n ;i++) { cin>>a[i]; } int a1 = 0, a2 = 0, neg = 0, pos = 0; for(int i = 0; i < n ;i++) { if(a[i] < 0) { swap(pos, neg); neg++; a1 += pos; a2 += neg; } else { pos++; a1 += pos; a2 += neg; } } cout< using namespace std; // O(n) approach using binomial coefficient // binomial coefficent int binomial(int n,int r){ int res=1; if(r > n-r) r = n-r; for(int i=0;i> n; cout< using namespace std; // O(n) approach using binomial coefficient // binomial coefficent int binomial(int n,int r){ int res=1; if(r > n-r) r = n-r; for(int i=0;i> s; int n = s.length(); cout< using namespace std; #define int long long int signed main(){ int t;cin >> t; while( t--){ int n , k; cin >> n >> k ; vector prices(k); for ( int i = 0; i < k ; i++ ) cin >> prices[i]; vector dp( 1001, INT_MAX); dp[0] = 0; for ( int i =0 ; i < k ; i ++ ){ if ( prices[i] == -1) continue; for ( int weight = i+1 ; weight <= k ; weight ++) { dp[ weight ] = min( dp[weight - i - 1] + prices[i] , dp[weight]); } } if ( dp[k] == INT_MAX){ cout << -1 << "\n"; } else cout << dp[k]; } } ================================================ FILE: spoj/ACODE - Alphacode.cpp ================================================ /* HINT Testcases 25114 1111111111 3333333333 109 20201 1013 211003 100 21103 101230 Output 6 89 1 1 1 2 0 0 2 */ #include using namespace std; #define ll long long int signed main() { while (true) { string s; cin >> s; if (s == "0")break; int n = s.size(); vector dp(n + 1, 0); dp[n-1]=1; if ( n>=2){ int x = (s[n-2] - '0') * 10 + s[n-1] - '0'; if ( x >= 10 && x <= 26 ) dp[n-2] =1; } int np = 0; for (int i = n - 2; i >= 0; i--){ if ( s[i+1] == '0' ) { if (s[i] == '0') np = 1; dp[i] += dp[i+2]; continue; } dp[i] += dp[i + 1]; int x = (s[i] - '0') * 10 + s[i + 1] - '0'; if (x >= 10 && x <= 26 && s[i+2] != '0') dp[i] += dp[i + 2]; } if ( np) cout << 0 << "\n"; else cout << dp[0] << "\n"; } } ================================================ FILE: spoj/AIBOHP - Aibohphobia.cpp ================================================ #include using namespace std; #define int long long int int dp[6103][6103]; signed main(){ int t; cin >> t; while( t--){ string s; cin >> s; string t =s; reverse( t.begin() , t.end()); memset( dp , 0 , sizeof(dp)); int n = s.size(); for ( int i = 1 ;i <= n ; i++ ){ for ( int j = 1 ; j <= n ; j++ ){ if ( s[i-1] == t[j-1]) dp[i][j] =1 + dp[i-1][j-1] ; dp[i][j] = max( dp[i][j] ,max( dp[i-1][j] , dp[i][j-1])); } } cout << n - dp[n][n] << "\n"; } } ================================================ FILE: spoj/ANARC09A - Seinfeld.cpp ================================================ #include using namespace std; #define int long long int signed main(){ for ( int t =1; ; t++){ string s; cin >> s; if ( s[0] == '-') break; int open = 0 ; int ans = 0 ; int n = s.size(); for ( int i = 0 ; i < n ; i ++){ if ( s[i] == '}'){ if ( !open){ ans++; open++; } else open--; } else open++; } cout < using namespace std; // problem: https://leetcode.com/problems/unique-paths/ class Solution { public: int uniquePaths(int m, int n) { vector>dp(m,vector(n,1)); for(int i=1;i using namespace std; // problem : https://leetcode.com/problems/unique-paths-ii class Solution { public: int uniquePathsWithObstacles(vector>& obstacleGrid) { int n=obstacleGrid.size(),m=obstacleGrid[0].size(); vector>dp(n,vector(m,1)); int f=0; for(int i=0;i using namespace std; // problem: https://leetcode.com/problems/video-stitching/ class Solution { public: int videoStitching(vector>& clips, int T) { int minm=0; int maxm=0; int total = 0; while(maxm < T){ for(int i=0;imaxm){ maxm = r; } } if(minm == maxm) return -1; minm = maxm; total++; } return total; } }; ================================================ FILE: zerosAndOnes.cpp ================================================ // link https://leetcode.com/problems/ones-and-zeroes/ #include using namespace std; class Solution { public: Solution(){} int findMaxForm(vector& strs, int m, int n) { int len = strs.size(); int dp[len+1][m+1][n+1]; memset(dp, 0, sizeof dp); for (int i=1;i<=len;i++){ int ones = count(strs[i-1].begin(), strs[i-1].end(), '1'); int zeros = strs[i-1].size()-ones; for (int j=0;j<=m;j++){ for (int k=0;k<=n;k++){ int res = dp[i-1][j][k]; if (zeros<=j && ones<=k) res = max(res, dp[i-1][j-zeros][k-ones]+1); dp[i][j][k] = res; } } } return dp[len][m][n]; } }; int main(){ Solution s; int m,n; cout<<"Enter the max zeros "; cin>>m; cout<<"Enter the max ones "; cin>>n; int strings; cout<<"Eneter the no of words "; cin>>strings; vectorwords; for(int i=0;i>str; words.push_back(str); } cout<