BJFU 1397 致我们终将逝去的爱情

时间:2021-04-01 05:48:45
 

LIS

由于要记录轨迹,所以不能用O(nlogn)优化,直接dp加father记录每个节点的转移。

 #include<cstdio>
#include<algorithm>
using namespace std;
const int Nmax=;
int n;
int num[Nmax];
int dp[Nmax];
int ans[Nmax];
int father[Nmax];
int last;
int main()
{
//freopen("bjfu.in","r",stdin);
while(scanf("%d",&n)==)
{
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
for(int i=;i<=n;i++)
dp[i]=;
for(int i=;i<=n;i++)
{
ans[i]=;
father[i]=;
}
int ans_max=;
for(int i=;i<=n;i++)
{
dp[i]=;
for(int j=;j<i;j++)
{
if(num[j]<num[i] && dp[i]<dp[j]+)
{
dp[i]=dp[j]+;
father[i]=j;
}
}
if(ans_max<dp[i])
{
ans_max=dp[i];
last=i;
}
}
printf("%d\n",ans_max);
for(int i=;i<=ans_max;i++)
{
ans[i]=last;
last=father[last];
}
for(int i=ans_max;i>=;i--)
{
printf("(%d,%d) ",ans[i],num[ans[i]]);
}
printf("\n");
}
return ;
}