赞
踩
int lengthOfLIS(vector<int>& nums) { int n = nums.size(); vector<int> dp(n, 1); int ret = 1; for(int i = 1; i < n; i++) { for(int j = 0; j < i; j++) { if(nums[j] < nums[i]) { dp[i] = max(dp[i], dp[j] + 1); } } ret = max(ret, dp[i]); } return ret; }
确定状态表示 -> dp[i]
的含义
i
位置元素为结尾的所有子序列中,最长的摆动序列的长度f[i]
:以i
位置元素为结尾的所有子序列中,最后一个位置呈现“上升”趋势的最长的摆动序列的长度g[i]
:以i
位置元素为结尾的所有子序列中,最后一个位置呈现“下降”趋势的最长的摆动序列的长度推导状态转移方程
j
为i
前面的任一一个数初始化:vector<int> f(n, 1), g(n, 1)
确定填表顺序:从左往右,两个表一起填
确定返回值:两个dp
表里的最大值
int wiggleMaxLength(vector<int>& nums) { int n = nums.size(); vector<int> f(n, 1), g(n, 1); int ret = 1; for(int i = 1; i < n; i++) { for(int j = 0; j < i; j++) { if(nums[j] < nums[i]) { f[i] = max(f[i], g[j] + 1); } else if(nums[j] > nums[i]) { g[i] = max(g[i], f[j] + 1); } } ret = max(ret, max(f[i], g[i])); } return ret; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。