动态规划
夜白有故事
热爱程序,一起进步
展开
-
Longest String Chain
原题链接 一般来说这种求最长序列问题都可以用动态规划来解决,那么这道题也不例外。核心的思路是将用一长度的字符串都压到同一个栈中,然后从最长的字符串开始往最短的逐级计算最长序列。还有一个地方关键点是判断两个字符串是否是有效的,即字符串w1和w2是否为长度差1,并且往w1中任意位置插入一个字符就可以得到w2.关键是找到状态转换方程,在这道题里面,我们用map<string,int> ma...原创 2019-05-20 09:59:15 · 403 阅读 · 0 评论 -
Edit Distance
原题链接 动态规划解决,dp[i][j] 表示 word1[1,i],word2[1,j]的edit distance 状态转换方程为: word1[i-1]==word2[j-1] -> dp[i][j] = dp[i-1][j-1] word1[i-1]!=word2[j-1] -> dp[i][j] = min(dp[i-1][j],dp[i][j-1])+1 clas...原创 2019-05-14 22:10:59 · 96 阅读 · 0 评论 -
Delete Operation for Two Strings
原题链接 这道题可以说是最长公共子序列问题的翻版,套用状态转换方程: dp[i][j]表示子字符串word1[0,i),word2[0,j)的解 I、当word1[i-1]==word2[j-1]时,dp[i][j]=dp[i-1][j-1]; II、当word1[i-1] != word2[j-1]时,dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1。 时间复杂度是O...原创 2019-05-31 19:18:41 · 212 阅读 · 0 评论 -
Minimum ASCII Delete Sum for Two Strings
原题链接 与这道题一样的解法(此处传送门) class Solution { public: int minimumDeleteSum(string s1, string s2) { int m = s1.size(),n = s2.size(); vector<vector<int>> dp(m+1,vector&...原创 2019-05-31 19:22:57 · 147 阅读 · 0 评论 -
Longest Increasing Subsequence最长增长子序列
原题链接 class Solution { public: int lengthOfLIS(vector<int>& nums) { int m = nums.size(); if(m==0||m==1)return m; vector<int> res(m,1); ...原创 2019-05-31 19:29:32 · 165 阅读 · 0 评论