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;
}
posted @ 2020-08-01 23:53  骇人的籽  阅读(105)  评论(0编辑  收藏  举报