diff --git a/divide_and_conquer/a.out b/divide_and_conquer/a.out new file mode 100755 index 0000000..5e907ab Binary files /dev/null and b/divide_and_conquer/a.out differ diff --git a/divide_and_conquer/mss.cpp b/divide_and_conquer/mss.cpp new file mode 100644 index 0000000..9b32551 --- /dev/null +++ b/divide_and_conquer/mss.cpp @@ -0,0 +1,56 @@ +//Maximun sum array sum problem +#include +#include + +int max(int a, int b) { return (a > b)? a : b; } + +int max(int a, int b, int c) { return max(max(a, b), c); } + +// Find the maximum possible sum in arr[] auch that arr[m] is part of it +int max_crossing_sum(int arr[], int l, int m, int h) +{ + + int sum = 0; + int left_sum = INT_MIN; + for (int i = m; i >= l; i--) + { + sum = sum + arr[i]; + if (sum > left_sum) + left_sum = sum; + } + + sum = 0; + int right_sum = INT_MIN; + for (int i = m+1; i <= h; i++) + { + sum = sum + arr[i]; + if (sum > right_sum) + right_sum = sum; + } + + return left_sum + right_sum; +} + +int max_sub_array_sum(int arr[], int l, int h) +{ + // Base Case: Only one element + if (l == h) + return arr[l]; + + // Find middle point + int m = (l + h)/2; + + return max(max_sub_array_sum(arr, l, m), + max_sub_array_sum(arr, m+1, h), + max_crossing_sum(arr, l, m, h)); +} + +int main() +{ + int arr[] = {3,5,6,7,8}; + int n = sizeof(arr)/sizeof(arr[0]); + int max_sum = max_sub_array_sum(arr, 0, n-1); + printf("Maximum contiguous sum is %d\n", max_sum); + getchar(); + return 0; +} \ No newline at end of file diff --git a/dynamic_programming/a.out b/dynamic_programming/a.out new file mode 100755 index 0000000..5ff9d37 Binary files /dev/null and b/dynamic_programming/a.out differ diff --git a/dynamic_programming/msis.cpp b/dynamic_programming/msis.cpp new file mode 100644 index 0000000..a8c4a39 --- /dev/null +++ b/dynamic_programming/msis.cpp @@ -0,0 +1,39 @@ + /*Maximum Sum Increasing Subsequence +(MSIS) problem */ +#include + +int maxSumIS(int arr[], int n) +{ + int i, j, max = 0; + int msis[n]; + + for ( i = 0; i < n; i++ ) + msis[i] = arr[i]; + + /* Compute maximum sum values + in bottom up manner */ + for ( i = 1; i < n; i++ ) + for ( j = 0; j < i; j++ ) + if (arr[i] > arr[j] && + msis[i] < msis[j] + arr[i]) + msis[i] = msis[j] + arr[i]; + + /* Pick maximum of + all msis values */ + for ( i = 0; i < n; i++ ) + if ( max < msis[i] ) + max = msis[i]; + + return max; +} + +// Driver Code +int main() +{ + int arr[] = {1, 100, 2, 3, 105, 4, 5}; + int n = sizeof(arr)/sizeof(arr[0]); + printf("Sum of maximum sum increasing " + "subsequence is %d\n", + maxSumIS( arr, n ) ); + return 0; +} \ No newline at end of file