DP(0)

动态规划

动态规划:从新手到专家

状态 | 状态转移方程
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)11
d(1)11
d(2)d(1)+12
d(3)d(2)+13
d(4)d(2)+13
d(5)d(4)+14

动态规划还真不好掌握。
每次遇到问题,都想不到动态规划。
知道了要用动态规划,又找不到状态状态方程
但是看别人的解题思路,似乎又都很明白。
这种感觉,如此相似。完全就像高中时做圆锥曲线。
所有的办法、定理都懂,但碰到新问题就很难攻克。看解答却感觉不新鲜。
总之,还是没有咂摸透。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值