1,Triangle

 int mininumTotal(vector<vector<int>>& triangle)  {
for (int i = triangle.size() - ; i >= ; --i) {
for (int j = ; j < i + ; ++j) {
// 从下往上依次保存当前路径的最小值,上层只会用到下层的最小值
triangle[i][j] += min(triangle[i + ][j], triangle[i + ][j + ]);
}
}
return triangle[][];
}

triangle

2,Maximum SubArray

 /*
* 状态转移方程为:f[j] = max{ f[j-1] + S[j],S[j] },其中 1 <= j <= n
* target = max{ f[j] },其中 1 <= j <= n
*/
int maxArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n + );
dp[] = ;
for (int i = ; i < n; ++i) {
dp[i + ] = max(dp[i] + nums[i], nums[i]);
}
return *max_element(dp.begin(), dp.end());

maxArray

3,Palindromic Substrings

 /*
* dp[i][j] 的值表示 s[i,j]这个字串是否为回文字符串
*/
int countSubstrings(string& s) {
int n = s.size();
int res = ;
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = n - ; i >= ; i--) {
for (int j = i; j < n; ++j) {
dp[i][j] = (s[i] == s[j] && (j - i <= || dp[i + ][j - ]));
if (dp[i][j]) res++;
}
}
return res;
}

countSubstrings

4,Palindromic Substrings(II)

 /*
* p[i][j]用来判断 s[i][j]这个字串是否是回文子串
* dp[i] 用来记录[0,i]这个范围内的最小切割数
* 所以只用求 dp[n-1] 的值就是答案
*/
int minCut(string& s) {
if (s.empty()) return ;
int n = s.size();
vector<vector<bool>> p(n, vector<bool>(n));
vector<bool> dp(n); for (int i = ; i < n; ++i) {
dp[i] = i; // 对 dp[i]初始化为最大切割数
for (int j = ; j <= i; ++j) { // 对每一个子串s[i][j]进行遍历
if (s[i] == s[j] && (i - j <= || p[j + ][i - ])) { // 如果s[j][i] 为回文子串
p[j][i] = true;
dp[i] = (j == ) ? : min(dp[i], dp[j - ] + );
}
}
}
return dp[n - ];
}

minCut

5,Longest Common Substring

 /*
× 求解最长公共子串(一定是连续才称为子串)
× 初始化:dp[0][j] = 0;dp[i][0] = 0; 第0行全为0,第0列全为0
× 0 ; (i==0 || j==0)
* 状态转移方程: dp[i][j] = dp[i-1][j-1] + 1; (s1[i] == s2[j])
* 0 ; (s1[i] != s2[j])
× 结果:每次保存字符串长度的最大值即为所求
*/
int lcs(string s1,string s2) {
int len1 = s1.length();
int len2 = s2.length();
int res = ;
vector<vector<int>> dp(len1+,vector<int>(len2+,)); for(int i=;i<=len1;++i) {
for(int j=;j<=len2;++j) {
if(s1[i] == s2[j]) dp[i][j] = dp[i-][j-] + ;
res = max(res,dp[i][j]);
}
}
return res;
} /*
* 求解最长子序列(不一定连续)
× 初始化:dp[0][j] = 0;dp[i][0] = 0;
* 0; (i == 0 || j == 0)
× 状态转移方程:dp[i][j] = dp[i-1][j-1] + 1; (s1[i] == s2[j])
* max(dp[i-1][j],dp[i][j-1]);(s1[i] != s2[j])
* 结果:最后保存的 dp[len1][len2] 即为所求
*/
int lcs(string s1,string s2) {
int len1 = s1.length();
int len2 = s2.length();
vector<vector<int>> dp(len1+,vector<int>(len2+,)); for(int i=;i<=len1;++i) {
for(int j=;j<=len2;++j) {
if(s1[i] == s2[j]) dp[i][j] = dp[i-][j-] + ;
else dp[i][j] = max(dp[i-][j],dp[i][j-]);
}
}
return dp[len1][len2];
}

lcs

leetcode 动态规划类型题的更多相关文章

  1. leetcode 字符串类型题

    1,Vaild Palindrome bool isPalindrome(string& s) { transform(s.begin(), s.end(), s.begin(), tolow ...

  2. leetcode 树类型题

    树的测试框架: // leetcodeTree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  3. leetcode 链表类型题总结

    链表测试框架示例: // leetcodeList.cpp : 定义控制台应用程序的入口点.vs2013 测试通过 // #include "stdafx.h" #include ...

  4. leetcode 数组类型题总结

    1,removeDuplicates(I) int removeDuplicatesI(vector<int>& nums){ // 重新组织数组,同 removeDuplicat ...

  5. leetcode 数组类型题

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h& ...

  6. leetcode动态规划--基础题

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 思路 根据题目意思,最大跳跃距离,说明可以跳0--n ...

  7. 快速上手leetcode动态规划题

    快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...

  8. LeetCode 第70题动态规划算法

    导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...

  9. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

随机推荐

  1. Dijkstra求最短路径&例题

    讲了半天好像也许maybe听懂了一点,先写下来233 先整理整理怎么存(开始绕) 最简单的是邻接矩阵存,但是开到10000*10000就MLE了,所以我们用链式前向星存(据说是叫这个名字吧) 这是个什 ...

  2. mac下 chmod 不了文件,可以右键查看文件简介处修改权限

  3. Python【每日一问】11

    问: 请简单说明一下以下代码的执行过程以及最终的输出结果 def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + ...

  4. 01-JDK环境配置

    环境说明: Window server 2008 64位 jdk-7u80-windows-x64 apache-tomcat-7.0.57-windows-x64 1.安装JDK环境配置 JAVA_ ...

  5. 数据库事务的四大特性以及事务的隔离级别(mysql)

      本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指 ...

  6. Python课程第一天作业

    一.第一题:简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型? 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的 ...

  7. 对map集合按照value从大到小进行排序

    概述: 基本特点: 该集合存储键值对,而且要保证键的惟一性 子类: |--HashTable 底层是哈希数据表结构,不可以使用Null作为键或者值:该集合线程是同步的 |--hashMap   底层是 ...

  8. Access Token 与 Refresh Token【转载哒科普啊】

    Access Token 与 Refresh Token   access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因 ...

  9. IDEA overwrite报错、languagelevel设置不生效问题

    发现idea 倒入项目后,发现@override报错,发现是idea的jdk版本不对,需要设置大于1.5的jdk版本 解决办法: IDEA:File >> Project Structur ...

  10. Python全栈开发记录_第七篇(模块_time_datetime_random_os_sys_hashlib_logging_configparser_re)

    这一篇主要是学习python里面的模块,篇幅可能会比较长 模块的概念:在Python中,一个.py文件就称之为一个模块(Module). 模块一共三种: python标准库 第三方模块 应用程序自定义 ...