题目描述 Description
LIS问题是最经典的动态规划基础问题之一。如果要求一个满足一定条件的最长上升子序列,你还能解决吗?
输入描述 Input
Description
第一行为两个整数N,K,如上所述。
输出描述 Output
Description
请输出两个整数,即包含第K个元素的最长上升子序列长度。
样例输入 Sample
Input
8 6
65 158 170 299 300 155 207 389
样例输出 Sample
Output
4
数据范围及提示 Data Size &
Hint
80%的数据,满足0
分类标签 Tags 点此展开
基本思路:
k之前的数正常更新
设置一个flag数组判断k+1之后的数,是不是由k更新过来的。
代码:
#include<
iostream >
using namespace
std;
#include<
cstdio >
#define N
200001
int
num[N],len[N];
bool
flag[N];
int
n,anslen=-N;
int main()
{
int k;
scanf("%d%d",&n,&k);
for(int
i=1;i<=n;++i)
{
scanf("%d",&num[i]);
len[i]=1;
if(i<=k&&i>=2)
{
for(int
j=1;j<=i-1;++j)
{
if(len[j]+1>len[i]&&num[j]
len[i]=len[j]+1;
}
}
flag[k]=1;
if(i>=k)
{
for(int
j=k;j<=i-1;++j)
{
if(len[j]+1>len[i]&&num[j]
{
len[i]=len[j]+1;
flag[i]=1;
}
}
if(len[i]>anslen&&flag[i])
anslen=len[i];
}
}
cout<<anslen<<endl;
return 0;
}