Skip to content
cpp
#include "iostream"
#include "vector"

using namespace std;

// Fibonacci


#include <iostream>

// Dynamic Programming Fibonacci!
// n<=0 -> 0
// n==1 -> 1
// n>1 --> n-1 + n-2

/**
 * Naive implementation of Fibonacci's formula with T(n)= O(n^2)
 *
 * @param n
 * @return
 */
int fib_rec(int n){
    if(n<=0){
        return 0;
    }else if (n<=1){
        return 1;
    }
    return fib_rec(n-1)+ fib_rec(n-2);
}

/* Dynamic Programming
 *
 * 1) Characterize the structure of an optimal solution.
 *
 * 2) Recursively define the value of an optimal solution.
 *      Fib(n) =
 *              Fib[n-1] + Fib[n-2],    if n>=3
 *              F[n],                   else.
 *
 * 3) Compute the value of an optimal solution, typically in a bottom-up fashion.
 *      TD: We can start from fib(n). If it is already in Fib[n] we return it, else we split recursively the
 *      subproblems fib(n-1), fib(n-2) and saved them in Fib[n-1], Fib[n-2] respectively.
 *
 *      BU: We can start from the base cases (smallest) and climb our way up the final solution, while saving our computations
 *      in Fib[]
 *
 * 4) Construct an optimal solution from computed information
 */

int fib_td_aux(int n, int *ptr){
    if(*(ptr+n)<=-1){
        *(ptr+n) = fib_td_aux(n-1, ptr)+ fib_td_aux(n-2, ptr);
    }
    return *(ptr+n);
}

/**
 * Fibonacci Dynamic Programming Top Down Solution with T(n) = O(2n), S(n) = Theta(n)
 *
 * @param n
 * @return
 */
int fib_td(int n) {
    // Array initialization with base cases
    int Fib[n];
    Fib[0] = 0, Fib[1] = 1;
    for (int i = 2; i <= n; i++)
        Fib[i] = -1;

    // Return the answer if is present or compute it and save it;
    return fib_td_aux(n, &Fib[0]);
}

/**
 * Fibonacci Dynamic Programming Bottom Up Solution with T(n) = O(n), S(n) = Theta(n)
 *
 * @param n
 * @return
 */
int fib_bu(int n){
    if(n>0){
        int Fib[n];
        Fib[0] = 0, Fib[1] = 1;

        for (int i = 2; i <= n; i++) {
            Fib[i] = Fib[i-1] + Fib[i-2];
        }
        return Fib[n];
    }else{
        return 0;
    }
}

int fib_optimized(int n){
    int result = 1, fib1 = 1 , fib2 = 1;
    for(int i = 3; i<=n; i++){
        result = fib1 + fib2;
        fib1 = fib2;
        fib2 = result;
    }
    return result;
}


// Cut Rod Solutions

int Naive_CR(vector<int> p, int n) {
    if (n == 0) {
        return 0;
    }else{
        int q = -1;
        for(int i = 1; i<=n; i++) {
            q = max(q, p[i] + Naive_CR(p, n - i));
        }
        return q;
    }
}

int Memoized_CR_Aux(vector<int> p, vector<int> r, int j){
    if(r[j]<0){
        if(j==0){
            r[j]=0;
        }else{
            int q = -1;
            for(int i = 1; i<=j; i++){
                q = max(q, p[i]+ Memoized_CR_Aux(p, r, j-i));
            }
            r[j]=q;
        }
    }
    return r[j];
}

int Memoized_CR(vector<int> p, int n){
    vector<int> r;
    r.push_back(-1);
    for(int i = 0; i<n; i++){
        r.push_back(-1);
    }
    return Memoized_CR_Aux(p, r, n);
}

int BU_CR(vector<int> p, int n){
    vector<int> r;
    for(int k=0; k<=n; k++){
        r.push_back(-1);
    }
    r[0]=0;

    for(int j=1; j<=n;j++){
        int q=-1;
        for(int i=1; i<=j; i++){
            q = max(q, p[i]+r[j-i]);
        }
        r[j]=q;
    }
    return r[n];
}

std::pair<vector<int>, vector<int>> BU_CR2(vector<int> p, int n){
    vector<int> r;
    vector<int> s;
    for(int k=0; k<=n; k++){
        r.push_back(-1);
        s.push_back(-1);
    }
    r[0]=0;
    s[0]=0;
    for(int j=1; j<=n;j++){
        int q=-1;
        for(int i=1; i<=j; i++){
            if(q < p[i]+r[j-i]){
                q = p[i]+r[j-i];
                s[j]=i;
            }
        }
        r[j]=q;
    }
    std::pair<vector<int>, vector<int>> sol = {r,s};
    return sol;
}

void Print_CR_BU_CR2(vector<int>p, int n){
    std::pair<vector<int>, vector<int>> sol = BU_CR2(p, n);
    int tot = 0;
    while(n>0){
        tot+= sol.first[sol.second[n]];
        n-= sol.second[n];
    }
    cout << "" << tot;
}

// LCS Solutions



// Palindrome



int main()
{
    vector<int> p = {0, 1,112,9,6,7,10, 18, 42, 55, 10};
    int n = 3;

    int max = BU_CR(p, n);
    cout << "" << max << "\n";

    Print_CR_BU_CR2(p, 3);


    return 0;
}
#include "iostream"
#include "vector"

using namespace std;

// Fibonacci


#include <iostream>

// Dynamic Programming Fibonacci!
// n<=0 -> 0
// n==1 -> 1
// n>1 --> n-1 + n-2

/**
 * Naive implementation of Fibonacci's formula with T(n)= O(n^2)
 *
 * @param n
 * @return
 */
int fib_rec(int n){
    if(n<=0){
        return 0;
    }else if (n<=1){
        return 1;
    }
    return fib_rec(n-1)+ fib_rec(n-2);
}

/* Dynamic Programming
 *
 * 1) Characterize the structure of an optimal solution.
 *
 * 2) Recursively define the value of an optimal solution.
 *      Fib(n) =
 *              Fib[n-1] + Fib[n-2],    if n>=3
 *              F[n],                   else.
 *
 * 3) Compute the value of an optimal solution, typically in a bottom-up fashion.
 *      TD: We can start from fib(n). If it is already in Fib[n] we return it, else we split recursively the
 *      subproblems fib(n-1), fib(n-2) and saved them in Fib[n-1], Fib[n-2] respectively.
 *
 *      BU: We can start from the base cases (smallest) and climb our way up the final solution, while saving our computations
 *      in Fib[]
 *
 * 4) Construct an optimal solution from computed information
 */

int fib_td_aux(int n, int *ptr){
    if(*(ptr+n)<=-1){
        *(ptr+n) = fib_td_aux(n-1, ptr)+ fib_td_aux(n-2, ptr);
    }
    return *(ptr+n);
}

/**
 * Fibonacci Dynamic Programming Top Down Solution with T(n) = O(2n), S(n) = Theta(n)
 *
 * @param n
 * @return
 */
int fib_td(int n) {
    // Array initialization with base cases
    int Fib[n];
    Fib[0] = 0, Fib[1] = 1;
    for (int i = 2; i <= n; i++)
        Fib[i] = -1;

    // Return the answer if is present or compute it and save it;
    return fib_td_aux(n, &Fib[0]);
}

/**
 * Fibonacci Dynamic Programming Bottom Up Solution with T(n) = O(n), S(n) = Theta(n)
 *
 * @param n
 * @return
 */
int fib_bu(int n){
    if(n>0){
        int Fib[n];
        Fib[0] = 0, Fib[1] = 1;

        for (int i = 2; i <= n; i++) {
            Fib[i] = Fib[i-1] + Fib[i-2];
        }
        return Fib[n];
    }else{
        return 0;
    }
}

int fib_optimized(int n){
    int result = 1, fib1 = 1 , fib2 = 1;
    for(int i = 3; i<=n; i++){
        result = fib1 + fib2;
        fib1 = fib2;
        fib2 = result;
    }
    return result;
}


// Cut Rod Solutions

int Naive_CR(vector<int> p, int n) {
    if (n == 0) {
        return 0;
    }else{
        int q = -1;
        for(int i = 1; i<=n; i++) {
            q = max(q, p[i] + Naive_CR(p, n - i));
        }
        return q;
    }
}

int Memoized_CR_Aux(vector<int> p, vector<int> r, int j){
    if(r[j]<0){
        if(j==0){
            r[j]=0;
        }else{
            int q = -1;
            for(int i = 1; i<=j; i++){
                q = max(q, p[i]+ Memoized_CR_Aux(p, r, j-i));
            }
            r[j]=q;
        }
    }
    return r[j];
}

int Memoized_CR(vector<int> p, int n){
    vector<int> r;
    r.push_back(-1);
    for(int i = 0; i<n; i++){
        r.push_back(-1);
    }
    return Memoized_CR_Aux(p, r, n);
}

int BU_CR(vector<int> p, int n){
    vector<int> r;
    for(int k=0; k<=n; k++){
        r.push_back(-1);
    }
    r[0]=0;

    for(int j=1; j<=n;j++){
        int q=-1;
        for(int i=1; i<=j; i++){
            q = max(q, p[i]+r[j-i]);
        }
        r[j]=q;
    }
    return r[n];
}

std::pair<vector<int>, vector<int>> BU_CR2(vector<int> p, int n){
    vector<int> r;
    vector<int> s;
    for(int k=0; k<=n; k++){
        r.push_back(-1);
        s.push_back(-1);
    }
    r[0]=0;
    s[0]=0;
    for(int j=1; j<=n;j++){
        int q=-1;
        for(int i=1; i<=j; i++){
            if(q < p[i]+r[j-i]){
                q = p[i]+r[j-i];
                s[j]=i;
            }
        }
        r[j]=q;
    }
    std::pair<vector<int>, vector<int>> sol = {r,s};
    return sol;
}

void Print_CR_BU_CR2(vector<int>p, int n){
    std::pair<vector<int>, vector<int>> sol = BU_CR2(p, n);
    int tot = 0;
    while(n>0){
        tot+= sol.first[sol.second[n]];
        n-= sol.second[n];
    }
    cout << "" << tot;
}

// LCS Solutions



// Palindrome



int main()
{
    vector<int> p = {0, 1,112,9,6,7,10, 18, 42, 55, 10};
    int n = 3;

    int max = BU_CR(p, n);
    cout << "" << max << "\n";

    Print_CR_BU_CR2(p, 3);


    return 0;
}