<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[How to DSA and SD]]></title><description><![CDATA[How to DSA and SD]]></description><link>https://blog.adityanarayan.co.in</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1748994112960/a6092db8-e497-465f-988d-1c04469dccc7.png</url><title>How to DSA and SD</title><link>https://blog.adityanarayan.co.in</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 20:18:50 GMT</lastBuildDate><atom:link href="https://blog.adityanarayan.co.in/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Dynamic Programming using Fibonacci – Approaches]]></title><description><![CDATA[Fibonacci series: 0, 1, 1, 2, 3, 5, 8, 13...Formula: f(n) = f(n-1) + f(n-2)

1. 🚀 Recursion (Brute Force)
int rec(int n) {
    if (n == 0 || n == 1) return n;
    return rec(n - 1) + rec(n - 2);
}

int fib(int n) {
    return rec(n);
}

Steps:

Base...]]></description><link>https://blog.adityanarayan.co.in/dynamic-programming-approaches</link><guid isPermaLink="true">https://blog.adityanarayan.co.in/dynamic-programming-approaches</guid><dc:creator><![CDATA[Aditya Narayan]]></dc:creator><pubDate>Tue, 03 Jun 2025 23:26:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748994274271/8b69d293-81d9-4e93-ae4d-5b9af7147061.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Fibonacci series: <code>0, 1, 1, 2, 3, 5, 8, 13...</code><br />Formula: <code>f(n) = f(n-1) + f(n-2)</code></p>
<hr />
<h2 id="heading-1-recursion-brute-force">1. 🚀 Recursion (Brute Force)</h2>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">rec</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span> || n == <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> n;
    <span class="hljs-keyword">return</span> rec(n - <span class="hljs-number">1</span>) + rec(n - <span class="hljs-number">2</span>);
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">fib</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">return</span> rec(n);
}
</code></pre>
<h3 id="heading-steps">Steps:</h3>
<ol>
<li><p>Base Case: Return n directly if it's 0 or 1.</p>
</li>
<li><p>Recursive Call: Call resolve(n-1) and resolve(n-2), and return their sum.</p>
</li>
<li><p>No memoization: This leads to repeated computations of the same subproblems.</p>
</li>
</ol>
<h3 id="heading-time-amp-space">Time &amp; Space:</h3>
<p>⏱ Time: O(2^n) 🧠 Space: O(n) (recursion stack) ❌ Recomputes subproblems ✅ Easy to understand</p>
<h2 id="heading-2-top-down-memoization-dp-array-gt-logic-gt-base-case-using-recursion">2. 🧰 Top-Down (Memoization): (dp-array -&gt; logic -&gt; base case, using recursion)</h2>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">topdown</span><span class="hljs-params">(<span class="hljs-built_in">vector</span>&lt;<span class="hljs-keyword">int</span>&gt;&amp; dp, <span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;

    <span class="hljs-keyword">if</span> (dp[n] == <span class="hljs-number">-1</span>) {
        dp[n] = topdown(dp, n - <span class="hljs-number">1</span>) + topdown(dp, n - <span class="hljs-number">2</span>);
    }
    <span class="hljs-keyword">return</span> dp[n];
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">fib</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-function"><span class="hljs-built_in">vector</span>&lt;<span class="hljs-keyword">int</span>&gt; <span class="hljs-title">dp</span><span class="hljs-params">(n + <span class="hljs-number">1</span>, <span class="hljs-number">-1</span>)</span></span>;
    <span class="hljs-keyword">return</span> topdown(dp, n);
}
</code></pre>
<h3 id="heading-steps-1">Steps:</h3>
<ol>
<li><p>Initialize a dp array with -1 to denote unsolved subproblems.</p>
</li>
<li><p>Base Case: Return n if n is 0 or 1.</p>
</li>
<li><p>Memoization Check: If dp[n] is already computed, return it.</p>
</li>
<li><p>Store Result: Calculate the result, store in dp[n], and return.</p>
</li>
</ol>
<h3 id="heading-time-amp-space-1">Time &amp; Space:</h3>
<p>⏱ Time: O(n) 🧠 Space: O(n) (dp array + recursion stack) ✅ Avoids recomputation</p>
<h2 id="heading-3-bottom-up-tabulation-dp-array-gt-base-case-gt-reverse-logic-using-loop">3. 📚 Bottom-Up (Tabulation): (dp-array -&gt; base case -&gt; reverse logic, using loop)</h2>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">tabsolve</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;

    <span class="hljs-function"><span class="hljs-built_in">vector</span>&lt;<span class="hljs-keyword">int</span>&gt; <span class="hljs-title">dp</span><span class="hljs-params">(n + <span class="hljs-number">1</span>, <span class="hljs-number">-1</span>)</span></span>;
    dp[<span class="hljs-number">0</span>] = <span class="hljs-number">0</span>;
    dp[<span class="hljs-number">1</span>] = <span class="hljs-number">1</span>;

    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">2</span>; i &lt;= n; i++) {
        dp[i] = dp[i - <span class="hljs-number">1</span>] + dp[i - <span class="hljs-number">2</span>];
    }

    <span class="hljs-keyword">return</span> dp[n];
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">fib</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">return</span> tabsolve(n);
}
</code></pre>
<h3 id="heading-steps-2">Steps:</h3>
<ol>
<li><p>Initialize a dp array of size n+1.</p>
</li>
<li><p>Set Base Cases: dp[0] = 0, dp[1] = 1.</p>
</li>
<li><p>Iterate from 2 to n, using previously computed values.</p>
</li>
<li><p>Return dp[n].</p>
</li>
</ol>
<h3 id="heading-time-amp-space-2">Time &amp; Space:</h3>
<p>✅ Iterative approach ⏱ Time: O(n) 🧠 Space: O(n) ✅ No recursion stack</p>
<h2 id="heading-4-space-optimized-tabulation">4. 🧪 Space Optimized (Tabulation)</h2>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">tabsolve</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span> || n == <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> n;

    <span class="hljs-keyword">int</span> prev = <span class="hljs-number">0</span>, curr = <span class="hljs-number">1</span>;

    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">2</span>; i &lt;= n; i++) {
        <span class="hljs-keyword">int</span> temp = curr + prev;
        prev = curr;
        curr = temp;
    }

    <span class="hljs-keyword">return</span> curr;
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">fib</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">return</span> tabsolve(n);
}
</code></pre>
<h3 id="heading-steps-3">Steps:</h3>
<ol>
<li><p>Base Case: Return n if it's 0 or 1.</p>
</li>
<li><p>Track Only Two Values: Use prev and curr to store f(n-2) and f(n-1).</p>
</li>
<li><p>Loop Forward: Update prev and curr for each i till n.</p>
</li>
<li><p>Return curr which holds f(n).</p>
</li>
</ol>
<h3 id="heading-time-amp-space-3">Time &amp; Space:</h3>
<p>⏱ Time: O(n) 🧠 Space: O(1) ✅ Best optimized</p>
<h2 id="heading-summary">🎯 Summary</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Approach</td><td>Time</td><td>Space</td><td>Notes</td></tr>
</thead>
<tbody>
<tr>
<td>Recursion</td><td>O(2^n)</td><td>O(n)</td><td>Brute force, not practical</td></tr>
<tr>
<td>Memoization</td><td>O(n)</td><td>O(n)</td><td>Top-down + cache</td></tr>
<tr>
<td>Tabulation</td><td>O(n)</td><td>O(n)</td><td>Bottom-up + full array</td></tr>
<tr>
<td>Space Optimized</td><td>O(n)</td><td>O(1)</td><td>Only two variables needed</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item></channel></rss>