![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
WKP9418
愿有一天开怀大笑
展开
-
递归与背包
题目,就最简单的01背包时间t,种类m设一函数opt(i)=max(opt(i-1),opt(i-1)+value_i)此函数含义是当前第i种选不选,不选,继续下一种;选,继续下一种+当前这一种的价值;那我们写递归就好了。void optimise(Herb *herb,int m,int t,int ans){ if(m==0) { bp=max(ans,bp); re...原创 2019-09-28 18:05:02 · 123 阅读 · 0 评论 -
5.最长回文串
四种方法,必须掌握前3种原创 2020-09-08 17:31:03 · 100 阅读 · 0 评论 -
96.不同的二叉搜索树
思考过程:1.能不能递归求出所有的二叉搜索树呢?2.相邻的答案之间有没有规律呢?3.找不到规律,但找出了每一个答案下的所有结果4.看题解,才明白。。下次做DP题目也这么思考,先看递归否,再找怎么由之前的答案推出现在的答案来。ans[n]为所求答案,也就是节点数为n时,有多少二叉搜索树。f(i)是以i为根节点的二叉搜索树的个数,左子树有i-1个元素,右子树有n-i个元素。所以f(i)=ans[i-1]*ans[n-i],左子树有ans[i-1]个可能,所以要相乘。class Solut.原创 2020-06-10 09:51:44 · 100 阅读 · 0 评论 -
63.不同的路径II
不是很难。初始化时想了想在转移时要判断当前有没有障碍物,有的话就是0;没有的话才可以路径相加。class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int dp[][]=new int[obstacleGrid.length][obstacleGrid[0].length]; if(obstacleGrid[0][0]==0) dp[0][0]=1; .原创 2020-05-16 15:58:31 · 128 阅读 · 0 评论 -
62.不同的路径
还记得高中的时候,美女老师讲过这题。但当时没听懂。现在也只能补补遗憾了。定义状态比较简单,就是走到每个方格处的位置。dp[i][j]表示走到i行,j列一共有多少方法转移也比较简单。题目说只能下,右行走,所以到达(i,j)处,可以由两个状态达到。class Solution { public int uniquePaths(int m, int n) { int dp[][]=new int[m][n]; for(int i=0;i<m;i+..原创 2020-05-15 14:17:29 · 101 阅读 · 0 评论 -
5.最长回文子串
中心扩展法取一位置,看他的左右两边。因为存在“aa”类似情况,所以先分别扫描左右两边,排除这种偶数的情况再左右两边一起扫描对每个位置都要执行,所以要保存最大的长度时间复杂度为O(n^2)class Solution { public String longestPalindrome(String s) { if(s.length()==0) return s; int len=1; int left=0,right=0; .原创 2020-05-15 13:56:23 · 118 阅读 · 1 评论 -
198.打家劫舍
1.定义状态dp[i]: 小偷在第i个房子做完决策后,拥有的所有钱财2. 状态转移那么到底第i个房子小偷偷不偷呢?偷。那么他一定不能偷第i-1个,只能在i-2的基础上增加钱财。即dp[i-2]+prices[i]不偷。那么钱数没有增加,还是dp[i-1]二者取最大,dp[i]=max(dp[i-1],dp[i-2]+prices[i]) int rob(vector<...原创 2020-04-12 17:22:22 · 150 阅读 · 0 评论 -
121.买卖股票的最佳时机
DP我们不能预测未来,只知道历史的股票价格。还好,本题只是计算一下最高利润。第i天时,那我们找到历史(i天及以前)最低价格,对以后的价格依次减去历史最低价即可。需要动态维护这个历史最低价格。 int maxProfit(vector<int>& prices) { if(prices.empty()) return NULL; int...原创 2020-04-12 16:06:27 · 145 阅读 · 0 评论 -
70.爬楼梯
1.递归解法模拟走楼梯即可。从第一节楼梯走到第N节楼梯 int climbStairs(int n) { int ans=0; dfs(n,ans,0); return ans; } void dfs(int n,int& ans,int i){ if(i==n){ ans++;...原创 2020-04-12 13:56:02 · 99 阅读 · 0 评论 -
P1164 小A点菜
小A点菜 题目背景`uim`神犇拿到了`uoi`的`ra`(镭牌)后,立刻拉着基友`小A`到了一家……餐馆,很低端的那种。`uim`指着墙上的价目表(太低级了没有菜单),说:“随便点”。 题目描述不过uim由于买了一些书,口袋里只剩MMM元(M≤10000)(M \le 10000)(M≤10000)。餐馆虽低端,但是菜品种类不少,有NNN种(N≤100)(N \le ...原创 2019-09-24 14:46:35 · 121 阅读 · 0 评论 -
P1049 装箱问题
装箱问题 题目描述有一个箱子容量为VVV(正整数,0≤V≤200000 \le V \le 200000≤V≤20000),同时有nnn个物品(0<n≤300<n \le 300<n≤30,每个物品有一个体积(正整数)。要求nnn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式111个整数,表示箱子容量111个整数,表示有nnn个物品接下来nn...原创 2019-09-23 22:19:50 · 108 阅读 · 0 评论 -
落谷 P1060 开心的金明
一个简单的动态规划。把钱数看做背包容量。#include<stdio.h>int max(int a,int b){ if(a>b) return a; return b; }int ans[30][30005]={0};前面是物品个数,后面是剩余钱数int main(void){ int n,m;//n is money scanf("%d%d",&am...原创 2019-05-07 19:58:25 · 122 阅读 · 2 评论 -
Common Subsequence 1159 hdu
动态规划的入门级别吧,加油继续努力。#include<stdio.h>#include<string.h>int max(int a,int b){ if(a>b) return a; return b;}int main(){ char str1[500]; char str2[500]; while(scanf("%s%s",str1+1,...原创 2019-04-30 21:26:22 · 210 阅读 · 0 评论