0% found this document useful (0 votes)
24 views9 pages

Dynamic Programming

Uploaded by

me23b076
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views9 pages

Dynamic Programming

Uploaded by

me23b076
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 9

70.

CLIMBING STAIRS (RECURSSIVE)


https://leetcode.com/problems/climbing-stairs/description/

int climbStairs(int n) {
if(n==0 or n==1){
return 1;
}
return climbStairs(n-1)+climbStairs(n-2);
}

70. CLIMBING STAIRS (memoisation)


https://leetcode.com/problems/climbing-stairs/description/

int cs(int n,vector<int> & dp){


if(dp[n]!=-1){
return dp[n];
}
return dp[n]=cs(n-1,dp)+cs(n-2,dp);
}
int climbStairs(int n) {
vector<int> dp(n+1,-1);
dp[0]=1;
dp[1]=1;
return cs(n,dp);
}

70. CLIMBING STAIRS (Tabulation)


https://leetcode.com/problems/climbing-stairs/description/

int climbStairs(int n) {
vector<int> dp(n+1,-1);
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}

\\\
(Improvised Tabulation)
\\\

int climbStairs(int n) {
int a=1;
int b=1;
if(n==0 or n==1){
return 1;
}
int c=-1;
for(int i=2;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}

403. FROG JUMP


// bool dfs(int curr_pos, int last_jump, const set<int>& stone_set, int last_stone)
{
// if (curr_pos == last_stone) return true;
// if (curr_pos > last_stone) return false;

// for (int jump = last_jump - 1; jump <= last_jump + 1; ++jump) {


// if (jump >= 1 && stone_set.count(curr_pos + jump)) {
// if (dfs(curr_pos + jump, jump, stone_set, last_stone)) {
// return true;
// }
// }
// }
// return false;
// }

map<pair<int, int>, bool> m;

bool dfs(int curr_pos, int last_jump, const set<int>& stone_set, int


last_stone){
pair<int, int> state = {curr_pos, last_jump};

if (m.find(state) != m.end()) {
return m[state];
}

if (curr_pos == last_stone) return true;

for (int jump = last_jump - 1; jump <= last_jump + 1; ++jump) {


if (jump >= 1 && stone_set.count(curr_pos + jump)) {
if (dfs(curr_pos + jump, jump, stone_set, last_stone)) {
return m[state] = true;
}
}
}

return m[state] = false;


}

bool canCross(vector<int>& stones) {


if (stones.size() < 2 || stones[1] != 1) return false;

set<int> stone_set(stones.begin(), stones.end());


int last_stone = stones.back();

return dfs(1, 1, stone_set, last_stone);


}

198. HOUSE ROBBER (MEMORISATION)

int rec(int curr,vector<int>& nums,vector<int> &s){


if(curr>=nums.size()){
return 0;
}
if(s[curr]!=-1){
return s[curr];
}
s[curr]= max(nums[curr]+rec(curr+2,nums,s),rec(curr+1,nums,s));
return s[curr];
}
int rob(vector<int>& nums) {
vector<int> s(nums.size()+1,-1);
return rec(0,nums,s);
}

198. HOUSE ROBBER (TABULATION)

int rob(vector<int>& nums) {


int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];

vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);

for(int i = 2; i < n; i++) {


int pick = nums[i] + dp[i - 2]; // Rob current house + value from i-2
int notpick = dp[i - 1]; // Skip current house
dp[i] = max(pick, notpick);
}

return dp[n - 1];


}

198. HOUSE ROBBER (TABULATION) (space optimised)

int rob(vector<int>& nums) {


int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];

int a = nums[0]; // dp[i-2]


int b = max(nums[0], nums[1]); // dp[i-1]

for(int i = 2; i < n; i++) {


int pick = nums[i] + a;
int notpick = b;
int curr = max(pick, notpick);
a = b;
b = curr;
}

return b;
}

213. ROB HOUSE II

int help(vector<int>& nums) {


int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];

vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);

for(int i = 2; i < n; i++) {


int pick = nums[i] + dp[i - 2]; // Rob current house + value from i-2
int notpick = dp[i - 1]; // Skip current house
dp[i] = max(pick, notpick);
}

return dp[n - 1];


}

int rob(vector<int>& nums){


int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];

vector<int>temp1,temp2;
for(int i=0;i<n;i++){
if(i!=0) temp1.push_back(nums[i]);
if(i!=n-1) temp2.push_back(nums[i]);
}
int ans1=help(temp1);
int ans2=help(temp2);
return max(ans1,ans2);
}

NINJAS TRAINING (https://www.naukri.com/code360/problems/ninja-s-training_3621003?


leftPanelTabValue=PROBLEM) (MEMORISATION)

int f(int day, int act, vector<vector<int>> &points, vector<vector<int>> &dp){


if(day>=points.size()){
return 0;
}
if(dp[day][act]!=-1){
return dp[day][act];
}
else{
int p=0;
int q=0;
int r=0;
if(act!=0){
p=points[day][0]+f(day+1,0,points,dp);
}
if(act!=1){
q=points[day][1]+f(day+1,1,points,dp);
}
if(act!=2){
r=points[day][2]+f(day+1,2,points,dp);
}
return dp[day][act]=max(p,max(q,r));
}
}
int ninjaTraining(int n, vector<vector<int>> &points)
{
// Write your code here.
vector<vector<int>> dp(points.size(),vector<int>(3,-1));
int p=f(0,0,points,dp);
int q=f(0,1,points,dp);
int r=f(0,2,points,dp);

return max(p,max(q,r));
}
62. UNIQUE PATH (MEMORISATION)

int rec(pair<int,int> curr,pair<int,int> end,vector<vector<int>>& dp){


if(curr==end){
return 1;
}
if(dp[curr.first][curr.second]!=-1){
return dp[curr.first][curr.second];
}
int count=0;
if(curr.first+1<=end.first){
count+=rec({curr.first+1,curr.second},end,dp);
}
if(curr.second+1<=end.second){
count+=rec({curr.first,curr.second+1},end,dp);
}
return dp[curr.first][curr.second]=count;

}
int uniquePaths(int m, int n) {
pair<int,int> start={0,0};
pair<int,int> end={m-1,n-1};
vector<vector<int>> dp(m,vector<int>(n,-1));
return rec(start,end,dp);
}

63. UNIQUE PATHS II (MEMORISATION)

int rec(pair<int,int> curr,pair<int,int> end,vector<vector<int>>& dp,


vector<vector<int>>& obstacleGrid){
if(curr==end){
return 1;
}
if(dp[curr.first][curr.second]!=-1){
return dp[curr.first][curr.second];
}
int count=0;
if(curr.first+1<=end.first and obstacleGrid[curr.first+1][curr.second]!=1){
count+=rec({curr.first+1,curr.second},end,dp,obstacleGrid);
}
if(curr.second+1<=end.second and obstacleGrid[curr.first][curr.second+1]!
=1){
count+=rec({curr.first,curr.second+1},end,dp,obstacleGrid);
}
return dp[curr.first][curr.second]=count;

}
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {

pair<int,int> start={0,0};
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1) {
return 0;
}
pair<int,int> end={m-1,n-1};
vector<vector<int>> dp(m,vector<int>(n,-1));
return rec(start,end,dp,obstacleGrid);
}

64. MINIMUM PATH SUM (MEMORISATION)

int rec(pair<int,int> curr,pair<int,int> end,vector<vector<int>>&


grid,vector<vector<int>>& dp){
if(curr==end){
return grid[curr.first][curr.second];
}
if(dp[curr.first][curr.second]!=-1){
return dp[curr.first][curr.second];
}
int right=INT_MAX;
int down=INT_MAX;
if(curr.first+1<=end.first){
down=grid[curr.first][curr.second]
+rec({curr.first+1,curr.second},end,grid,dp);
}
if(curr.second+1<=end.second){
right=grid[curr.first][curr.second]
+rec({curr.first,curr.second+1},end,grid,dp);
}
return dp[curr.first][curr.second]=min(down, right);
}
int minPathSum(vector<vector<int>>& grid) {
pair<int,int> start={0,0};
int m=grid.size();
int n=grid[0].size();
pair<int,int> end={m-1,n-1};
vector<vector<int>> dp(m,vector<int>(n,-1));
return rec(start,end,grid,dp);
}

120. TRIANGLE (MEMORISATION)

int rec(pair<int,int> curr,vector<vector<int>>& triangle,int


height,vector<vector<int>>& dp){
if(curr.first==height-1){
return triangle[curr.first][curr.second];
}
if(dp[curr.first][curr.second]!=-1){
return dp[curr.first][curr.second];
}
int left=INT_MAX;
int right=INT_MAX;
left=triangle[curr.first][curr.second]
+rec({curr.first+1,curr.second},triangle,height,dp);
right=triangle[curr.first][curr.second]
+rec({curr.first+1,curr.second+1},triangle,height,dp);
return dp[curr.first][curr.second]=min(left,right);
}
int minimumTotal(vector<vector<int>>& triangle) {
int height=triangle.size();
int base=triangle[height-1].size();
pair<int,int> start={0,0};
vector<vector<int>> dp;
for (int i = 0; i < height; ++i) {
dp.push_back(vector<int>(triangle[i].size(), -1));
}
return rec(start,triangle,height,dp);

416. PARTITION EQUAL SUBSET SUM (TABULATION SOLN)

bool canPartition(vector<int>& nums) {


int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 2 != 0) return false;

int target = sum / 2;


int n = nums.size();
vector<vector<bool>> dp(n+1, vector<bool>(target+1, false));

for (int i = 0; i <= n; i++) {


dp[i][0] = true; // base case: sum 0 is always possible
}

for (int i = n-1; i >= 0; i--) {


for (int t = 0; t <= target; t++) {
bool notPick = dp[i+1][t];
bool pick = (t - nums[i] >= 0) ? dp[i+1][t - nums[i]] : false;
dp[i][t] = pick || notPick;
}
}

return dp[0][target];
}

695. MAXIMUM AREA OF ISLAND

int maxAreaOfIsland(vector<vector<int>>& grid){


int m=grid.size();
int n=grid[0].size();
int res=0;
vector<vector<int>> vis(m,vector<int>(n,-1));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1 and vis[i][j]==-1){
int len=1;
queue<pair<int,int>> q;
q.push({i,j});
vis[i][j]=1;
while(!q.empty()){
auto [r,c]=q.front();
q.pop();
for(auto [dr,dc]: dir){
int newr=r+dr;
int newc=c+dc;
if(newr<m and newr>=0 and newc<n and newc>=0){
if(grid[newr][newc]==1 and vis[newr][newc]==-1){
q.push({newr,newc});
vis[newr][newc]=1;
len++;
}
}
}
}
res=max(res,len);
}
}
}
return res;
}

322. COIN CHANGE (MEMORISATION SOLN)

int rec(vector<int>& coins, int amount, vector<int>& dp) {


if (amount == 0) return 0;
if (amount < 0) return INT_MAX;

if (dp[amount] != -1) return dp[amount];

int minCoins = INT_MAX;


for (int i = 0; i < coins.size(); i++) {
int res = rec(coins, amount - coins[i], dp);
if (res != INT_MAX) {
minCoins = min(minCoins, res + 1);
}
}
return dp[amount] = minCoins;
}

int coinChange(vector<int>& coins, int amount) {


vector<int> dp(amount + 1, -1);
int res = rec(coins, amount, dp);
return (res == INT_MAX) ? -1 : res;
}

322. COIN CHANGE (TABULATION SOLN)

int coinChange(vector<int>& coins,int amount){


vector<int> dp(amount+1,INT_MAX);
dp[0]=0;
for(int i=1;i<=amount;i++){
for(auto coin: coins){
if(i-coin>=0 and dp[i-coin]!=INT_MAX){
dp[i]=min(dp[i],dp[i-coin]+1);
}
}
}
return dp[amount]==INT_MAX ? -1:dp[amount];
}

2915. LENGTH OF LONGEST SUBSEQUENCE THAT SUMS TO TARGET (MEMORISATION SOLUTION)

int rec(vector<int>& nums, int target, int index,vector<vector<int>>& dp) {


if (target == 0) return 0;
if (index == nums.size() || target < 0) return INT_MIN;

if(dp[target][index]!=-1){
return dp[target][index];
}

// Choice 1: Include nums[index]


int take = rec(nums, target - nums[index], index + 1,dp);
if (take != INT_MIN) take += 1;
// Choice 2: Skip nums[index]
int skip = rec(nums, target, index + 1,dp);

return dp[target][index]=max(take, skip);


}

int lengthOfLongestSubsequence(vector<int>& nums, int target) {

vector<vector<int>> dp(target+1,vector<int>(nums.size(),-1));
int res = rec(nums, target, 0,dp);
return (res == INT_MIN) ? -1 : res;
}

LONGEST COMMON SUBSTRING

int longestCommonSubstr(string& text1, string& text2){


int m=text1.size();
int n=text2.size();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
int ans=0;
for(int i=m-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
if(text1[i]==text2[j]){
dp[i][j]=1+dp[i+1][j+1];
ans=max(ans,dp[i][j]);
}
else{
dp[i][j]=0;
}
}
}

return ans;
}

139. WORD BREAK

bool wordBreak(string s, vector<string>& wordDict) {


int n=s.size();
vector<bool> dp(n+1,false);
dp[n]=true;
for(int i=s.size()-1;i>=0;i--){
for(auto& x: wordDict){
int len=x.size();
if(i+len <=n and x==s.substr(i,len)){
dp[i]=dp[i+len];
if (dp[i]) break;
}
}
}
return dp[0];
}

You might also like