zoukankan      html  css  js  c++  java
  • CF264BGood Sequences

    CF264BGood Sequences

    题面

    大意

    寻找最长递增字串,使得相邻两个数不互质。

    思路

    动态规划思想,ans记录当前的数以下标i为约数答案,使得需要填进去的数肯定与前一个数不互质。在开始前根据数据先打表记录每个数的最小约数,然后就可以得到,循环遍历数组,对每个数存在的可能最长子序列,一定有在ans数组中以该数的约数作为下标的最大值为先前的序列的最大值,然后再次循环将ans数组中每一个下标为该数约数的位置赋值为刚刚求出的最大值加1,相当于所有的约数部分可以与下一个数匹配生成再下一个循环。

    可能不是讲的很清楚,所以在代码中还有注释。

    代码

    #include<iostream>
    using namespace std;
    int sign[100005], ans[100005];
    int main() {
        for(int i=2;i<100005;i++) {
            if(!sign[i]) {
                for(int j=i;j<100005;j+=i) {
                    if(!sign[j]) {
                        sign[j] = i;// 标记每个数的最小约数
                    }
                }
            }
        }
        int n, m;
        cin >> n;
        for(int i=1;i<=n;i++) {
            int temp, num;
            cin >> num;
            temp = num;
            m = 0;
            while(temp>1) {
                m = max(m, ans[sign[temp]]);// 获取之前数里的约数的个数最大值
                temp/=sign[temp]; // 去掉这个约数
            }
            temp = num;
            while(temp>1) {
                ans[sign[temp]] = m+1;// 给所有约数所在的位置赋值为最大约数个数+1
                temp/=sign[temp]; // 去掉这个约数
            }
        }
        m = 1;
        for(int i=1;i<=n;i++) {
            m = max(m, ans[i]);
        }
        cout << m;
    }
    
  • 相关阅读:
    CF553C Love Triangles
    CF875C National Property
    【UOJ #210】【UER #6】寻找罪犯
    ICPC南昌网络赛I题Yukino With Subinterval
    进阶式-日志打印-构建器模式
    Java 对象类型
    mqtt 消息重传
    Java 关键字 final 知识点巩固
    MQTT 5.0 新特性
    emqx 认证详细
  • 原文地址:https://www.cnblogs.com/JoshuaYu/p/13417325.html
Copyright © 2011-2022 走看看