dp专题五
最优矩阵链乘问题
题目要求
一个n×m阶矩阵和一个m×p阶矩阵连乘 运算量是nmp
有n个矩阵链乘 可以给矩阵加括号改变运算顺序 求最小的运算次数
参考代码
|
|
思路
迭代过程如下:
最优三角剖分
题目要求
对于一个n个顶点的凸多边形 用n-3条对角线把他分成n-2个三角形 每个三角形规定一个权函数w(i,j,k)要求分成的所有三角形
权函数最大
参考代码
|
|
经典DP问题
LIS
本博客中均给出了n^2和nlogn复杂度的两种算法
转跳博客链接
LCS
状态转移方程为:
若该位置匹配dp[i][j]=dp[i-1][j-1]+1
若该位置不匹配dp[i][j]=max(dp[i-1][j],dp[i][j-1])
详见此题
连续和最大子序列问题
本题有经典的HDU 1003和HDU 1231
HDU-1003转跳链接
HDU 1231仅在1003的基础上略做修改
Problem Description
Input
Output
Sample Input
Sample Output
参考AC代码
|
|
HDU 1257
Problem Description
Input
Output
Sample Input
Sample Output
参考AC代码–dp(LIS)
|
|
参考AC代码–贪心
|
|
思路
贪心的思路较好理解 相当于判断每个系统最多能走多远 若新的高度所有系统都不满足 那么增加新的系统
dp的思路实际就是求数组的LIS长度 那么为什么可以用LIS长度呢 换句话说 为什么LIS长度就是题目的答案呢
以17 16 15 16 13 12 14 15为例
原因有如下三点:
(1)例中的LIS长度为2 第一个满足LIS=2的是数字15 16 那么后面的所有数字中不可能出现LIS=3的连续递增子序列 最多只会有2个 例如12 14
(2)后面的LIS=2的子序列肯定越来越小 例如第一个为15 16 那么后面的可能为13 14,接着比如是10 12,否则LIS就不等于2 会等于4或更多
(3)那么LIS=2的2个数字中 肯定有一个会被15的系统解决 一个被16的系统解决 所以问题得到解决 LIS就是题目答案
UVA 1471
题目要求
给一个长度为n的序列 你的任务是删除一个连续子序列 使得剩下的序列中有一个长度最大的连续递增子序列 例如,将序列{5,3,4,9,2,8,6,7,1}中的
{9,2,8}删除 得到的序列{5,3,4,6,7,1}中包含一个长度为4的连续递增子序列{3,4,6,7} 序列每个数均不超过10^9的正整数
参考AC代码
|
|
思路
算法入门经典(二)P242
最大子矩阵问题
HDU 1506
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
给出一个直方图 每个直方图的底长为1 给出n个直方图的高度 求直方图中的最大矩形面积
参考AC代码
|
|
HDU 1505
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
求全是F的矩形的最大面积
在上一题的基础上由一维变成二维 做法类似
在二维数组里算出连续是F的高度 每一行用上题一样的算法求解 最后把每行求得的最大值再求最大值就是答案
参考AC代码
|
|
HDU 2870
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
给出一个矩阵 wxyz分别可以换成abc中的某一个二个或者全部 求更新后的矩阵里 字母相同的最大矩阵面积
本题相当于再在上题的基础上增加了abc三个状态 因为最后肯定是转换成全为abc状态中的某一个 所以在上一题
求每一行最大值的基础上再多算上三个状态即可
参考AC代码
|
|