动态规划专题

LeetCode 动态规划L1

2021-03-07  本文已影响0人  Tsukinousag

开二维数组dp[][] 且i与j下标都从1开始:

vector<vector<int>>dp(len1+1,vector<int>(len2+1,0));

53. 连续数组最大子序和

dp[i]=max(dp[i-1]+nums[i],nums[i])
Max=max(Max,dp[i])

面试题 17.16. 按摩师

状态转移考虑dp[i][0/1],对于第i个状态时对该物品,选还是不选
当dp[i][0]时,dp[i][0]可以由dp[i-1][0]或者dp[i-1][1]转移
当dp[i][1]时,dp[i][1]仅可由dp[i-1][0]+w[i]
优化到一维
状态转移考虑dp[0/1],对于第i个状态时对该物品,选还是不选
当dp[0]时,dp[0]可以由dp[0]或者dp[1]转移
当dp[1]时,dp[1]仅可由dp[0]+w[i]

1025. 除数博弈

f[i] 表示当前数字 i 的时候先手是处于必胜态还是必败态,true表示先手必胜,false表示先手必败,从前往后递推,根据我们上文的分析,枚举 i 在 (0, i)中 i的因数 j,看是否存在 f[i-j]为必败态,若存在必败状态,直接使bob转移到必败态即可

121. 买卖股票的最佳时机

dp[i]表示i时刻得到的最大收益,那么dp[i]=max(dp[i-1],price[i]-premin)不卖与卖

1143. 最长公共子序列

if(text1[i-1]==text2[j-1])//手动滑稽,text文本串下标还是从0开始的
    dp[i][j]=dp[i-1][j-1]+1;
else
    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

746. 使用最小花费爬楼梯

dp[i]吃到第i层楼梯的最小花费
dp[i]=min(dp[i-1],dp[i-2])+cost[i]

面试题 08.01. 三步问题

dp[i]=((dp[i-1]+dp[i-2])%mod+dp[i-3])%mod;

70. 爬楼梯

dp[i]=dp[i-1]+dp[i-2];

392. 判断子序列

双指针做法最简单

class Solution {
public:
    bool isSubsequence(string s, string t) {
        //双指针问题
        int i=0,j=0;
        int n=s.size(),m=t.size();
        while(i<n&&j<m)
        {
            if(s[i]==t[j]) i++;
            j++;
        }
        if(i==n)
            return true;
        else 
            return false;
    
    }
};
上一篇下一篇

猜你喜欢

热点阅读