动态规划
动态规划:从新手到专家
状态 | 状态转移方程
DAG : 有向无环图
LCS
最长公共子序列(longest common squence):不要求连续
最长公共子串(longest common substring):要求连续
lis最长数字序列
状态
d(i) : 表示前i个数中以A[i]结尾的最长非降子序列的长度
状态方程
d(i) = max{1, d(j)+1} ,其中j
//最长数字序列,不连续
int lis(int A[], int n){
int *d = new int[n];
int len = 1;
for(int i=0; i<n; ++i){
d[i] = 1;
for(int j=0; j<i; ++j)
if(A[j]<=A[i] && d[j]+1>d[i]) //状态方程
d[i] = d[j] + 1; //i,j不连续
if(d[i]>len) len = d[i];
}
delete[] d;
return len;
}
int main(){
int A[] = {5, 3, 4, 8, 6, 7};
cout<<lis(A, 6)<<endl;
return 0;
}
状态 | 状态转移 | 结果 |
---|---|---|
d(0) | 1 | 1 |
d(1) | 1 | 1 |
d(2) | d(1)+1 | 2 |
d(3) | d(2)+1 | 3 |
d(4) | d(2)+1 | 3 |
d(5) | d(4)+1 | 4 |
动态规划还真不好掌握。
每次遇到问题,都想不到动态规划。
知道了要用动态规划,又找不到状态和状态方程。
但是看别人的解题思路,似乎又都很明白。
这种感觉,如此相似。完全就像高中时做圆锥曲线。
所有的办法、定理都懂,但碰到新问题就很难攻克。看解答却感觉不新鲜。
总之,还是没有咂摸透。