zoukankan      html  css  js  c++  java
  • 【dp每日一题】CF566F. Clique in the Divisibility Graph

    大意:

    给出一个长度为n的排好序的数组,要求选出一个子数组,每一对数都是整除关系,问该数组长度最大是多少

    数据范围:(1leq nleq 1e^6,1leq a_ileq 1e^6)

    思路:

    因为数据的长度和范围都是(1e^6),所以可以想到开辟一个(pos)数组,存储(a_i)的位置,这样就可以利用类似筛素数的方法进行转移,复杂度(O(n*log{n}))

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N = 1e6 + 5;
    typedef long long LL;
    int n,a[N],pos[N],dp[N],maxn,res;
    int main(){
        cin >> n;
        for (int i = 1; i <= n;i++){
            scanf("%d", &a[i]);
            pos[a[i]] = i;
            dp[i] = 1;
        }
        maxn = a[n];
        for (int i = 1; i <= n;i++){
            for (int j = a[i] * 2; j <= maxn;j+=a[i]){
                if(pos[j]==0){
                    continue;
                }
                int x = pos[j];
                dp[x] = max(dp[i] + 1, dp[x]);
            }
        }
        for (int i = 1; i <= n;i++){
            res = max(res, dp[i]);
        }
        cout << res << endl;
        return 0;
    }
    
  • 相关阅读:
    看书笔记《python基础》__1
    MQTT
    杂记
    类型转化
    soc
    时钟同步
    设置地址
    清理日志
    pandas_matplot_seaborn
    Qt_Quick开发实战精解_4
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/14072010.html
Copyright © 2011-2022 走看看