📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:最长上升子序列(一)
- 题目链接
- 方法一:简单dp
- 思路
- 代码
- 复杂度
牛客热题:最长上升子序列(一)
题目链接
最长上升子序列(一)_牛客题霸_牛客网 (nowcoder.com)
方法一:简单dp
思路
①状态表示
d p [ i ] dp[i] dp[i]表示以 a r r [ i ] arr[i] arr[i]为结尾的最长上升子序列的长度
②状态转移
d p [ i ] = m a x ( d p [ i ] , d [ j ] + 1 ) dp[i] = max(dp[i], d[j] + 1) dp[i]=max(dp[i],d[j]+1)
③初始化
对于所有的初始状态,都应该设置为1,因为对于以每一个位置结尾的最长上升子序列的长度最小为1
④填表顺序
外层循环,从左到右,内部循环,均可
⑤返回值
d p [ i ] dp[i] dp[i]中的最大值
代码
int LIS(vector<int>& arr)
{
int n = arr.size();
if(n == 1) return 1;
int res = 0;
//dp[i]表示以arr[i]为结尾的最长的子序列的长度
vector<int> dp(n, 1);
for(int i = 1; i < n; ++i)
{
for(int j = i - 1; j >= 0; --j)
{
if(arr[i] > arr[j])
dp[i] = max(dp[i], dp[j] + 1);
}
res = max(res, dp[i]);
}
return res;
}
复杂度
时间复杂度: O ( N 2 ) O(N ^ 2) O(N2), 双层循遍历数组的同时,遍历当前节点之前的所有节点
空间复杂度:O(N), 额外使用了一个和原数组长度相同的dp数组