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. docker 搭建 hustoj

    docker 搭建 hustoj hustoj 是个GPL开源的OJ,其提供了docker形式的安装方式. 为执行方便,选择使用aliyun提供的docker镜像来加速安装. 拉取镜像 docker ...

  2. hdfs知识点《转》

    HDFS知识点总结   学习完Hadoop权威指南有一段时间了,现在再回顾和总结一下HDFS的知识点. 1.HDFS的设计 HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Dist ...

  3. JAVA之Mybatis基础入门--框架搭建与简单查询

    JAVA中,操作数据库有JDBC.hibernate.Mybatis等技术,今天整理了下,来讲一讲下Mybatis.也为自己整理下文档: hibernate是一个完全的ORM框架,是完全面向对象的.但 ...

  4. sql中的等于和不等于, '=' ,'!=','<>','is null'....

    不等于:<> ,!=,~= ,^= 这四个符号据说都可以在oracle中表示不等于,但是试了之后发现<> ,!= ,^=是可以的,~=不行,需要注意的是,只有<>是 ...

  5. 最全面的DialogFragment的使用,实现DialogFragment全屏、背景透明;

    Android推荐使用DialogFragment代替Dialog,好处就说一点吧,DialogFragment就是个盖在界面上的Fragment,它拥有Fragment一样的功能和生命周期,解决普通 ...

  6. The component and implementation of a basic gradient descent in python

    in my impression, the gradient descent is for finding the independent variable that can get the mini ...

  7. c++数据类型漫谈

    在计算机眼里所有数据都是0101,二进制才是物理世界的主宰,c++的数据类型相对其他高级语言是相对较细的,因为是继承C而来,但是c++为什么要设计这么多数据类型呢?因为人类难以理解二进制,这就是数据类 ...

  8. 如何使用cloudflare的CDN加速网站隐藏网站IP

    原文:http://www.safecdn.cn/contact-zh/2018/12/cloudflare-cdn/1146.html 高防CDN:https://www.safeidc.cn/cd ...

  9. 打造适合自己的vim编辑器方法总结

    vim使用方法总结 说明:这是打造适合自己的vim编辑器的进阶方法,关于vim基础知识,请自行百度.也可参考文章末尾推荐blog网址 如果觉得自己打造vim编辑器麻烦,可以从github上面克隆一个, ...

  10. LWIP之ARP协议

    描述ARP缓存表的数据结构: struct etharp_entry { struct etharp_q_entry *q; //数据包缓冲队列指针 ip_addr_t ipaddr; //目标IP地 ...