第一篇题解,好激动
题目解读
输入一个字符串,大写开头的是人名,要求输出这个字符串的最长上升子序列。
开始解题
对于如此大的数据:
对于二分,我们可以使用 lower_bound 函数,就是下界判断 lower_bound(a.begin(),a.end(),value) 就是当查找到的值:
由次我们就可以查找到数组中最小的数进行替换。
代码
#include <bits/stdc++.h>
using namespace std;
string a,dp[1000005],s[1000005],ans[1000005];
int h=0,t=0,cnt=1,idx=1,len=0;
int main()
{
cin>>a;
for(int i=0;i<a.size();i++)
{
if(isupper(a[i]))
s[++cnt]=a[i];
else
s[cnt]+=a[i];
}
for(int i=1;i<=cnt;i++)
{
int pos=int(lower_bound(dp+1,dp+len+1,s[i])-dp);
len=max(len,pos);
dp[pos]=s[i];
ans[pos]=ans[pos-1]+s[i];
}
cout<<ans[len];
return 0;
}