dp常见问题
1,子数组的最大累加和问题
输入一个数组arr,输出子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据, 题目第一行输入N(数组的元素个数),第二行输入数组元素。
[要求]
时间复杂度为O(n),空间复杂度为O(1)
**示例 **
输入:
7
-1 -2 3 5 -2 6 -1
输出:
12
**备注 **
1 ≤ N ≤ 10e5
arr[i] ≤ 100当子数组为 3 5 -2 6 时, 子数组最大为:12
2, 买卖股票的最好时机
描述
假设你有一个数组,其中第 i 个元素是股票在第 i 天的价格。
你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。题目第一行输入N(数组的元素个数),第二行输入数组元素。
示例
输入:
3
1 4 2
输出:
3
备注
当第一天买入,第二天卖出,收益最大
3,求路径
描述
一个机器人在m×n大小的地图的左上角(起点)。
机器人每次向下或向右移动。机器人要到达地图的右下角(终点)。
可以有多少种不同的路径从起点走到终点?
备注:m和n小于等于100,并保证计算结果在int范围内
题目第一行输入m,n。 输出有多少种不同的路径从起点走到终点
示例1
输入:
2 1
输出:
1
示例2
输入:
2 2
输出:
2
4, 0-1背包
题目描述
给定n种物品和一个背包。物品i的重量是w[i],其价值为v[i],背包容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
题目第一行输入物品总数n和背包容量c; 第二行输入物品的重量, 第三行输入物品的体积
示例
输入:
4 8
2 3 4 5
3 4 5 8
输出:
12
5,矩阵的最小路径和
描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
题目第一行输入n行m列,随后输入矩阵a。 输出最小路径和。
示例
输入:
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
输出:
12
6,不相邻最大子序列和
描述
输入一个n(1<=n<=10e5),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
题目第一行输入数组长度n; 第二行输入长度为n的数组; 输出最大子序列和
示例
输入:
3
1 2 3
输出:
4
7,最长公共子串的长度
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串的长度
题目保证str1和str2的最长公共子串存在且唯一。
第一行输入str1,第二行输入str2
示例
输入:
1AB2345CD
12345EF
输出:
4
备注
最长的公共子串为2345;
8, 换钱的最少货币数
描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.
第一行输入不同面值数目m 和 要找的钱数 aim; 第二行输入不同的面值arr
示例1
输入:
3 20
5 2 3
输出:
4
示例2
输入:
3 0
5 2 3
输出:
0
示例3
输入:
2 2
5 3
输出:
-1
9, 租用游艇问题
描述
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1到游艇出租站n所需的最少租金。第1行中输入1个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1行是r(i,j),1<=i<j<=n
示例
输入:
4
5 15 30
7 16
20输出:
21
10, 最长公共子序列
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列
示例
输入:
1A2C3D4B56
B1D23A456A
输出:
123456