动态规划粗浅理解及LCS思路

来源:互联网 发布:淘宝信誉提升 编辑:程序博客网 时间:2024/05/01 13:10

动态规划 常用方法是递归,递归的本质是原问题拆解成子问题
原问题(N)->子问题(N-1)->原问题(N)
动态规划两个性质
1:最优子结构
子问题的最优决策可导出原问题最优决策
N-1 可以推出N
无后效性

 2:重叠子问题      去除冗余          空间换时间

套路 关键词:
最优,最大,最小,最长,计数
都是离散问题

四个步骤 :
设计暴力算法,找到冗余
设计并存储状态
递归式
自底向上

最长公共子序列长度 (LCS)
题目解释 :一个给定序列的子序列是在该序列中删去若干元素后得到的序列 空序列也是,顺序是不变的 

* 给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序 
列X和Y的公共子序列 

* 最长公共子序列 

* X=(A,B,C,B,D,A,B) Y=(B,D,C,A,B,A) 

* (B,C,B,A) (B,D,A,B)
* Z 子序列
* X[n]
* Y[m]
* search(n, m)
i, j 一共可以选择四种移动方法
search(i, j) #明显
search(i-1, j)
search(i, j-1)
search(i-1, j-1)
* int search(int i, int j){ #i, j 是指X, Y的下标从 n,m 进行搜索
if(i == 0 || j == 0)
return 0;
* 决策:
* return max (if(x[i] == y[j])
* search(i-1, j-1) + 1 #因为x[i] 和y[i]相等 , search(i-1, j) , search(i, j-1) 


0 0