首页 > 其他分享 >代码随想录训练营第34天|dp前置转移

代码随想录训练营第34天|dp前置转移

时间:2024-09-16 12:50:49浏览次数:11  
标签:int 随想录 Solution 34 vector 拆分 public dp

62. 不同路径

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,1));
        for(int i=1; i<m;i++){
            for(int j=1; j<n; j++){
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};

dp[i][j]:运动至(i,j)的方案数

转移方程:可由上/左两个方向转移而来,累加不同的方案数。

63. 不同路径 II

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int row=obstacleGrid.size();
        int col=obstacleGrid[0].size();
        vector<vector<int>> dp(row, vector<int>(col,0));
        for(int j=0; j<col&&obstacleGrid[0][j]==0; j++)
            dp[0][j]=1;
        for(int i=0; i<row&&obstacleGrid[i][0]==0; i++)
            dp[i][0]=1;
        for(int i=1; i<row; i++){
            for(int j=1; j<col; j++){
                if(obstacleGrid[i][j]==0){
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        return dp[row-1][col-1];
    }
};

dp[i][j]:运动至(i,j)的方案数

转移方程:

  • 没有障碍物的情况下,可以由上或左两个方向转移而来;
  • 有障碍物的情况只能取0,表示没有方案,不可达。

343. 整数拆分

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1,0);
        dp[2]=1;
        for(int i=3; i<=n; i++){
            for(int j=1; j<i; j++){
                dp[i]=max({dp[i],dp[i-j]*j,(i-j)*j});
            }
        }
        return dp[n];
    }
};

dp[i]:拆分i可以达到的最大乘积

转移方程:给定i,可能由任何一个前置的j拆分而来,对于剩下的部分(i-j)由两种选择:

  • 1.不拆,此时拆分乘积为 (i-j)*j
  • 2.拆,此时拆分乘积为 dp[i-j]*j

根据dp的定义对二者取最大。

另外,dp[1]初始化为0,表示拆分1的情况是非法的,这样取max后自然被过滤掉。

96. 不同的二叉搜索树

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1,0);
        dp[0]=1;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=i; j++){
                dp[i]+=dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
};

dp[i]:给定节点数i,可构造的搜索树数目

转移方程:给定节点数i,搜索树的根可以取1、2……i,dp[i]累加不同情况而来。选定j(j<=i)作为根:

  • 左子树节点数为:j-1,左子树的形态数目:dp[j-1]。
  • 右子树节点数为:i-(j+1)+1,形态数:dp[i-j],不需要关注每个节点具体数值的差异。
  • 根据乘法原理,由左右子树个数得到整个树的形态数:dp[j-1]*dp[i-j]。

标签:int,随想录,Solution,34,vector,拆分,public,dp
From: https://blog.csdn.net/jiyisuifeng1991/article/details/142300539

相关文章

  • Springboot工商闲置单车销售平台2r343(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着城市化进程的加快和单车市场的快速发展,大量商家和个人拥有闲置单车,这些单车不仅占用了宝贵的空间资源,还造成了环境浪费。因......
  • 代码随想录算法训练营,9月16日 | 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插
    235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先文档讲解︰代码随想录(programmercarl.com)视频讲解︰二叉搜索树的最近公共祖先日期:2024-09-16想法:相比于普通二叉树,二叉搜索树从上往下遍历,在qp中间的值的一定是公共祖先,而第一个则是最近,因为此时你在这个祖......
  • DP 总集
    决策单调性/四边形不等式满足四边形不等式(交叉\(\leq\)包含),即满足\(a\leqb\leqc\leqd\)时,\(w(a,c)+w(b,d)\leqw(a,b)+w(c,d)\)的满足决策单调性。大约有几种写法:分治:适用于相邻层之间转化例题:TheBakery考虑求出\(f[i][k]\)\((1\leqi\leqn)\)的值:......
  • 代码随想录算法训练营Day5 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的
    哈希表理论基础哈希表哈希表是根据关键码的值而直接进行访问的数据结构。数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:哈希表一般用来快速判断一个元素是否出现集合里。哈希函数哈希函数通过特定编码方式,可以将其......
  • 文心一言 VS 讯飞星火 VS chatgpt (347)-- 算法导论23.2 6题
    六、假定一个图中所有的边权重均匀分布在半开区间[0,1)内。Prim算法和Kruskal算法哪一个可以运行得更快?如果要写代码,请用go语言。文心一言:在比较Prim算法和Kruskal算法在特定条件下的性能时,我们需要考虑几个因素,主要是图的表示方式、边的数量、顶点的数量以及边的权重分布。由于在......
  • Springboot高校心理咨询系统y34td程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着社会压力的增加和心理健康问题的日益突出,高校学生的心理健康问题备受关注。传统的面对面心理咨询存在时间和空间限制,难以满......
  • Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
    操作序列:简单的二维dp。观察我们每次操作可以让\(x\)变为\(2x-1\),或者当\(x\)为奇数时让\(x\)变为\(\frac{x+1}{2}\)。显然,执行第一种操作,会使\(x\)变成奇数。那一旦我们连续执行两次操作,\(x\)就会变为:\[\frac{(2x+1)-1}{2}=\frac{2x}{2}=x\]也就是说,当\(x\)......
  • VPS Ubuntu22.04 安装WordPress 搭建网站 详细全流程(基于Apache+MySQL+PHP)(二)
    VPSUbuntu22.04安装WordPress搭建网站详细全流程(基于Apache+MySQL+PHP)(二)简介在网站处理和网络管理方面,WordPress是用户可以采取的最明智的选择。由于WordPress的巨大优势,它在网页设计师中广受欢迎。统计数据显示,访问量最大的1000个网站中约有35%是WordPress。......
  • DP of DP
    将内层DP的结果作为外层DP的状态进行DP。P10614BZOJ3864Heromeetdevil考虑LCS的转移,\(g_{i,j}=g_{i-1,j-1}+1[s_i=t_j]\)或\(g_{i,j}=\max(g_{i-1,j},g_{i,j-1})[s_i\net_j]\)。一个朴素的想法是,设\(f_{i,s}\)表示\(T\)的前\(i\)位,与\(S\)的LCS数组为......
  • DC-2靶机上了解和练习WordPress框架
    前言DC-2是一款非常受欢迎的靶机,通常用于学习和实践不同的安全工具和技术,特别是针对Web应用程序,比如WordPress。通过在DC-2靶机的这些练习,你将更好地理解和掌握搭建和管理一个安全、稳定、高效的WordPress博客所需的各种技能。环境搭建攻击机:KaliIP地址:192.168.18......