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. gridview使用小知识

    1.列改变为select,不能使用gridview.SelectedRow.Cells[0].Text 2.事件执行顺序 RowCommandPageIndexChangingPageIndexCha ...

  2. ES timeout 的一些笔记

    首先解释下Timeout的作用: 比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来.然而,在某些场景下,客户是等不了10分钟的.比如,淘宝搜东西的时候,客户宁可等 ...

  3. java 中的强制转换

    强制转换分两种,一种是基础类型强制转换(Type Conversion),一种是引用类型强制转换(Class Casting):

  4. js滚动到指定位置

    序言:在网络上百度,关键字:“js div滚动到指定位置”,结果基本上大同小异!各种大神都给我们总结出来了四种滚动到指定位置的办法,可惜再下愚钝,每个都不会用,所以写了一个超级简单的方法来使初学者一看 ...

  5. app:processOfficalDebugResources报错的几种解决方法;

    Error:Execution failed for task ':app:processDebugResources'. 出现这个错误的同事,大多还会伴随的R文件的报错,对!是全部R文件都报错: 1 ...

  6. java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  7. SQL修改某个字段中某相同部分(MySQL)

    格式:UPDATE 表名 SET 字段名= REPLACE( 替换前的字段值, '替换前关键字', '替换后关键字' )  WHERE 条件;比如:update t_book SET book_no ...

  8. java生成简单验证码图片

    概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...

  9. C语言程序实现,统计字符串里面各个字符的个数在总字符个数中的比例,并打印输出。

    #include<stdio.h> int main() { char *ppp= "aaassadddeeds"; ] = {};//存放字符 uint32 ccnt ...

  10. AES/CBC/PKCS7Padding加密方式

    在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AE ...