DP
给个选择
世界上只有10种人,一种懂二进制,一种不懂。
展开
-
打家劫舍 II
相较于打家劫舍,算是一个升级版。既然是打家劫舍的升级版,那我们就先找与原版之间的联系。做过打家劫舍之后我们知道状态转移方程是dp[i]=max(dp[i-1],dp[i-2]+nums[i-1])。然后我们再来看这道题,由相邻的一家变成了相邻的两家。那么就相当于把原来的一条直线首尾相连变成了一个环,这句话你细品,哈哈。所以我们要做的就是把这个环怎么变成直链,因为首尾相连,所以我们如果偷第一家就...原创 2020-03-03 15:42:33 · 368 阅读 · 0 评论 -
不同路径 II
class Solution {public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m=obstacleGrid.size(),n=obstacleGrid[0].size(); vector<vector<...原创 2020-02-28 09:54:27 · 315 阅读 · 0 评论 -
最长有效括号
class Solution {public: int longestValidParentheses(string s) { vector<int>dp(s.size(),0); int maxn=0; for(int i=1;i<s.size();i++) { if(s[i]=...原创 2020-02-28 09:01:50 · 298 阅读 · 0 评论 -
圆圈中最后剩下的数字
如果开始圈子里只有一个人,就返回0;如果不是一个人,那么删去一个人后 状态变为dp【n-1,m】 ,原先 第m+1位置的人因为m没了坐在了第m的位置 并且从他开始编号为0 所以是m向0转移所以调用(dp(n-1,m)+m)%n【递推】class Solution {public: int lastRemaining(int n, int m){ if(n==1) ...原创 2020-02-27 20:27:47 · 359 阅读 · 0 评论 -
连续子数组的最大和
class Solution {public: int maxSubArray(vector<int>& nums) { int sum=0,maxn=-1000000; for(int i=0;i<nums.size();i++) { if(sum<0) sum=nums[i]...原创 2020-02-27 20:17:29 · 222 阅读 · 0 评论 -
把数字翻译成字符串
dp[i] 表示以第i位字符结尾的字符串 有多少种解码方式分为两种状态:1。第i位单独解码 那么dp[i]=dp[i-1];2。如果第i-1位和第i位可以组合 那么相对于前i-2位的字符串来说 就相当于加上了一个二位数此时dp[i]=dp[i]+dp[i-2];代码如下:class Solution {public: int getTranslationCount(s...原创 2020-02-25 17:41:26 · 205 阅读 · 0 评论 -
最长回文子串
dp[i][j]存放的是[i,j]是否是回文区间dp[i][j]=dp[i+1][j-1]&&(s[i]==s[j])去除两端之间的子串是回文子串,且两端相等class Solution {public: string longestPalindrome(string s) { int maxn=0,len=s.length(); s...原创 2020-02-27 21:11:45 · 288 阅读 · 0 评论 -
最长上升子序列【线性DP】
在这里插入代码片#include<bits/stdc++.h>using namespace std;const int maxn=10010;int n,a[maxn],f[maxn];int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++...原创 2020-02-16 16:12:44 · 201 阅读 · 0 评论 -
数字三角形【线性DP】
#include<bits/stdc++.h>using namespace std;const int N=510,inf=1e9;int f[N][N],a[N][N],n;int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>a[i][j];...原创 2020-02-16 16:07:48 · 209 阅读 · 0 评论