动态规划,俗称DP,是算法进阶中很重要的问题。
解DP题,一般有这么几个步骤:
1.打表,在DP中,打表为了让我们更快的发现规律
2.根据你所列出的规律,写出状态转移方程式,如果状态转移方程写错了,那么一道题的思路就错了。
那么,根据以上DP方法,可以看一道例题:
一个数的序列bibi,当b1<b2<...<bSb1<b2<...<bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN)(a1,a2,...,aN),我们可以得到一些上升的子序列(ai1,ai2,...,aiK)(ai1,ai2,...,aiK),这里1≤i1<i2<...<iK≤N1≤i1<i2<...<iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
求最长上升子序列,可以打出以下表格:
0 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 2 | 2 | 3 | 4 | 3 | 3 |
那么就是在这些表格的数中选出最大的,那么肯定是4个,故答案为4。
上面的过程可以如此实现:开两个区间指针i,j,让j<=i,那么只要j<=i并且dp[j]<dp[i],就形成了一个上升子序列,最后,只要在dp数组中选最大的,就是答案。
代码:
#include<bits/stdc++.h>
using namespace st