62.不同路径
文章链接:代码随想录
状态:没做出来
思路:第一步没问题,确定dp数组的含义为从(0,0)出发到(i,j)有dp[i][j]条路径,要注意的点主要是在初始化这个部分,不能仅仅初始化dp[0][0],dp[0][1]和dp[1][0],而是要对左上角的一行一列都进行初始化:
for(int i = 0;i < n;i++) dp[0][i] = 1;
for(int j = 0;j < m;j++) dp[j][0] = 1;
剩下的就比较常规。
63.不同路径Ⅱ
文章链接:代码随想录
状态:没做出来
思路:和上面一题不同的地方主要是在有障碍物,主要影响的是初始化和递推公式
初始化:遇见障碍物应该怎么初始化?由于机器人只能往下或者往右走,则初始化时如果有一个障碍物在边上就只能是
vector<vector<int>> dp(m,vector<int>(n,0));
for(int i = 0;i < m && obstacle[i][0] == 0;i++) dp[i][0] = 1;
for(int j = 0;j < n && obstacle[0][j] == 0;j++) dp[0][j] = 1;
还有一个要变得地方是在遍历过程中,递推公式也要有判断条件:
if(obstacle[i][j] == 0) 这时才dp[i][j] = dp[i-1][j] + dp[i][j-1];
343.整数拆分
文章链接:代码随想录
状态:没做出来
思路:
①dp数组的含义:表示分拆数字i得到的最大乘积
②递推公式:
有两种渠道可以得到dp[i]:a.将i拆分成j * (i - j) b. 将i拆分成 j*dp[i - j]
如何保证j同时也被拆分了?就是j从1开始遍历,也就包含了所有可拆分的情况,之所以不写作
dp[i-j] * dp[j],是因为如果这样就默认至少要将i拆分成4份,有问题的这样是
这里的递推公式写作dp[i] = max(dp[i],max(j * (i - j) , j * dp[i - j]))
为什么还要和dp[i]比大小,因为是要取递推过程中最大的那一个dp[i]
③初始化:直接从dp[2]开始进行初始化,dp[2] = 1
则有:
for (int i = 3; i <= n ; i++) {for (int j = 1; j < i - 1; j++) {dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}
}
今天就这样 开组会