【DP】 Longest Increasing Subsequence

本文通过一个具体的C语言程序示例介绍了如何利用动态规划解决最长递增子序列问题,并分享了作者对该问题的理解过程及算法实现的思考。

今天看了一晚上书,始终没能弄明白最长增长公共子序列用动态规划算法的实现。

书中意思是,根据输入的数组建立dag,存储形式为邻接表的逆表(即后继结点的指针指向前驱结点)。当时百思不得其解,有没有必要建立的dag。

后来上网搜了一下,发现其实dag只是用来辅助理解的,而我竟然将其理解为要真实建立以个dag。

反思:算法思想还是很肤浅,没有真正领悟DP思想。

附源码:

#include <stdio.h> #include <dos.h> #define N 8 int main() { int num[N] = {1, 2, 3, 4, 5, 6, 7, 8}; int max[N] = {1}; int i; int j; int MaxCount = 1; for (i = 1; i < N; i++) { for (j = 0; j < i; j++) { if (num[i] > num[j] && max[i] >= max[j]) max[i] = max[j] + 1; } } for (i = 0; i < N; i++) { if (max[i] > MaxCount) MaxCount = max[i]; } printf("/n%d", MaxCount); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值