目录
1 动态规划(DP)
1.1 最长上升子序列(LIS)
1.1.1 O(n^2)
//求到第i位的最长子串长度
for (int i=0;i<len;i++)
{
//自己的长度1
dp[i]=1;
for (int j=0;j<i;j++)
{
//第i位比第j位大更新dp[i]
if (s[i]>s[j])
dp[i]=max(dp[j]+1,dp[i]);
}
//更新答案
if (dp[i]>ans)
ans=dp[i];
}
//ans即答案
cout << ans << endl;
1.1.2 O(nlogn)
//初始化dp为inf=0x3f3f3f
memset(dp,inf,sizeof(dp));
for (int i=0;i<len;i++)
{
//获取位置
int pos=lower_bound(dp,dp+len,s[i])-dp;
//更新位置
dp[pos]=s[i];
ans=max(ans,pos);
}
//答案为ans+1
cout << ans+1 << endl