目录
引例
画图分析:
使用动态规划解决
1.状态表示
dp[i]表示以i位置元素为结尾的子序列中,最长递增子序列的长度
2.状态表示 对于子数组/子序列的问题都可以划分为长度为1,长度大于1两种情况
3.初始化 可以将dp表中的值初始化为最差的情况,即单个值构成子序列,初始化为1
4.填表顺序 从左往右
5.返回值 因为子序列的结束位置是任意的,所以返回值是dp表中的最大值
具体代码:
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;
}
经典LeetCode OJ题
1.第一题
画图分析:
使用动态规划解决
1.状态表示
dp[i]表示以i位置元素为结尾的所有子序列中,最长摆动子序列的长度
但在分析时,会发现结尾位置会出现两种情况
因此对于摆动的子序列或子数组,在状态表示时,是需要使用两个状态来表示的
f[i]表示以i位置元素为结尾的所有子序列中,最后一个位置呈现"上升"趋势的最长摆动序列的长度
f[i]表示以i位置元素为结尾的所有子序列中,最后一个位置呈现"下降"趋势的最长摆动序列的长度
2.状态转移方程----根据子序列构成来分析
3.初始化
可以将f,g表中的值先初始化为最差的情况,即1
4.填表顺序 从左往右两个表一起填
5.返回值 两个表中的最大值
具体代码:
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)//填f[i],g[i]
{
for(int j=0;j<i;++j)
{
if(nums[j]<nums[i]) f[i]=max(g[j]+1,f[i]);
else if(nums[j]>nums[i]) g[i]=max(f[j]+1,g[i]);
}
ret=max(ret,max(f[i],g[i]));
}
re