这篇文章给大家聊聊关于高效算法解析:深入浅出动态规划应用与技巧,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
类解决方案{
公共:
int minPathSum(向量网格) {
int m=grid.size();
int n=grid[0].size();
向量f(m,向量(n,0));
f[0][0]=网格[0][0];
for(int i=1;i
62. Unique Paths
机器人位于amxngrid 的左上角(下图中标记为“开始”)。
机器人在任何时间点只能向下或向右移动。
机器人试图到达网格的右下角(标记为
下图中的“完成”)。
有多少种可能的独特路径?
上面是一个3 x 7 的网格。有多少种可能的独特路径?
Note:mandn 最多为100.class 解决方案{
公共:
int uniquePaths(int m, int n) {
向量f(100,向量(100,0));
f[0][0]=1;
for(int i=1;i
63. Unique Paths II
跟进“唯一路径”:
现在考虑是否在网格中添加了一些障碍物。会有多少条独特的路径?
网格中的障碍物和空白空间分别标记为1 和0。
例如,
3x3 网格的中间有一个障碍物,如下图所示。
[
[0,0,0],
[0,1,0],
[0,0,0]
]唯一路径的总数为2。
注意: m 和n 最多为100。
类解决方案{
公共:
int uniquePathsWithObstacles(矢量障碍网格){
int m=障碍网格.size();
int n=障碍网格[0].size();
向量f(m,向量(n,0));
if(obstacleGrid[0][0]==0)
f[0][0]=1;
别的
f[0][0]=0;
for(int i=1;i
72. Edit Distance
给定两个单词word1和word2,求将word1转换为word2所需的最少步骤数。(每次操作计为1步。)
您可以在word: 上执行以下3 项操作
a) 插入一个字符
b) 删除一个字符
c) 替换一个字符
类解决方案{
公共:
int minDistance(字符串word1, 字符串word2) {
int m=word1.size();
int n=word2.size();
如果(米=0)
返回n;
如果(n=0)
返回米;
向量f(m+1,向量(n+1,0));
//f[i][j]表示长度为i的字符串word1和长度为j的字符串word2之间的最短距离。
f[0][0]=0;//没有字母
for(int i=1;i=m;i++)
{
f[i][0]=i;
}
for(int j=1;j=n;j++)
{
f[0][j]=j;
}
for(int i=1;i=m;i++)
for(int j=1;j=n;j++)
{
if(word1[i-1]==word2[j-1]) //f中第i个字母对应word1[i-1],第j个字母对应word2[j-1]
f[i][j]=f[i-1][j-1];
别的
f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1])) + 1;
}
返回f[m][n];
}
};
115. Distinct Subsequences
给定一个字符串S 和一个字符串T,计算S 中T 的不同子序列的数量。
字符串的子序列是在不影响剩余字符相对位置的情况下,从原始字符串中删除一些(可以没有)字符而形成的新字符串。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是)。
这是一个例子:
S="兔子",T="兔子"
返回3.
类解决方案{
公共:
int numDistinct(字符串s, 字符串t) {
int m=s.size();
int n=t.size();
if(mf(m+1,向量(n+1,0));
//f[i][j]表示长度为i的字符串word1和长度为j的字符串word2之间的最短距离。
f[0][0]=1;//没有字母
for(int i=1;i=m;i++)
{
f[i][0]=1;
}
for(int j=1;j=n;j++)
{
f[0][j]=0;
}
for(int i=1;i=m;i++)
for(int j=1;j=n;j++)
{
if(s[i-1]!=t[j-1]) //f中第i个字母对应word1[i-1],第j个字母对应word2[j-1]
f[i][j]=f[i-1][j];//删除一个字母
别的
f[i][j]=f[i-1][j-1] + f[i-1][j];//添加一个字母,或者删除s的一个字母
}
返回f[m][n];
}
};
118. Pascal"s Triangle
给定numRows,生成帕斯卡三角形的前numRows。
例如,给定numRows=5,
返回
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]类解决方案{
公共:
矢量生成(int numRows){
矢量温度;
矢量记录(行数,临时);
for(int i=0;i
119. Pascal"s Triangle II
给定索引k,返回帕斯卡三角形的第k 行。
例如,给定k=3,
返回[1,3,3,1]。
类解决方案{
公共:
矢量getRow(int rowIndex){
矢量温度;
矢量记录(行索引+1,临时);
for(int i=0;i
120. Triangle
给定一个三角形,求从上到下的最小路径和。每一步你都可以移动到下一行的相邻数字。
例如,给定以下三角形
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]从上到下的最小路径和为11(即2 + 3 + 5 + 1=11)。
类解决方案{
公共:
intminimumTotal(向量三角形){
int m=三角形.size();
int 结果=INT_MAX;
向量f(m,向量(m,0));
f[0][0]=三角形[0][0];
for(int i=1;i
【高效算法解析:深入浅出动态规划应用与技巧】相关文章:
用户评论
动态规划确实很有趣!
有14位网友表示赞同!
算法学习中,动态规划是必修课!
有14位网友表示赞同!
感觉动态规划很像分解复杂问题的方法.
有9位网友表示赞同!
第一次接触动态规划的时候有点懵逼...
有17位网友表示赞同!
现在很多竞赛都考动态规划吧?
有14位网友表示赞同!
希望以后能学到更高级的动态规划技巧!
有16位网友表示赞同!
感觉代码实现起来会很考验思维能力.
有10位网友表示赞同!
有没有推荐一些好的动态规划学习资源?
有20位网友表示赞同!
动态规划应用场景还挺广泛的呀!
有20位网友表示赞同!
这种算法学完能明显提高编程效率吗?
有13位网友表示赞同!
最开始理解递归和动态规划有点费劲.
有18位网友表示赞同!
动态规划真的很有用,特别是在解决重复计算的问题上。
有14位网友表示赞同!
感觉动态规划需要很强的逻辑思维能力才能掌握!
有20位网友表示赞同!
学习动态规划的过程真是令人兴奋!不断解开一个个谜题的感觉太棒了 !
有7位网友表示赞同!
动态规划的应用领域真的非常广泛,有很多实用价值。
有10位网友表示赞同!
学习动态规划之后,编程思路更加清晰了!
有12位网友表示赞同!
现在很多资料都讲解得很详细, 让我很容易理解动态规划!
有15位网友表示赞同!
想学好动态规划,需要多练习才会掌握到精髓.
有10位网友表示赞同!
用 动态规划 解决问题的过程就像是一场拼图比赛!
有11位网友表示赞同!
我觉得学习动态规划能够提升整体算法设计能力!
有9位网友表示赞同!