LeetCode 动态规划L1

开二维数组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;
    
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 5. 最长回文子串[https://leetcode-cn.com/problems/longest-palind...
    1nvad3r阅读 1,547评论 0 0
  • 此博文是继动态规划总结之后的案例分析 动态规划的代码很简洁,基本在20行以内。 一维状态定义53 最大子序和要求元...
    wanghuohuo0716阅读 3,523评论 0 0
  • 139. 单词拆分[https://leetcode-cn.com/problems/word-break/] d...
    1nvad3r阅读 1,586评论 0 0
  • 总结:https://labuladong.gitbook.io/algo/ 最长回文子串 https://lee...
    我是小曼巴阅读 3,690评论 0 1
  •   为了准备三月份蓝桥杯的比赛和提高下自己数据结构和算法方面的水平,所以开始在leetcode上刷起了题。刚刚开始...
    冯宇祺阅读 8,948评论 0 5