题意简述
有一个长度为$n$的序列$a$,$n<=1e6$。根据这个序列生成一个无向图:若$a[u]$和$a[v]$中一个是另一个的倍数,那么$u$到$v$连一条无向边。请你求出这个图的最大团(最大子完全图)。
思路框架
设$dp[i]$表示以$i$为最小值的图的最大团。先dp[i]=1,然后dp[i的倍数]=max(dp[i的倍数],dp[i])即珂。这样更新是O(n/1+n/2…+n/n)=O(nlogn)的。(关于这个,自己百度“调和级数”,看它减去nlogn的收敛性)。
具体思路
为什么我们能想到这样的dp呢?首先,如果$a$到$b$有连边,$b$到$c$有连边,那么$a$到$c$也有连边。同理推得,我们只要找到一条递增的链使得长度最长即珂。因为只要有一条链,那就肯定有一张完全图。
然后最长链问题,就直接DP出来了。
代码
1 |
|