Codeforces 264B Good Sequences【dp+思维】

来源:互联网 发布:故宫淘宝实体店地址 编辑:程序博客网 时间:2024/06/05 04:43

B. Good Sequences
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Squirrel Liss is interested in sequences. She also has preferences of integers. She thinksn integers a1, a2, ..., an aregood.

Now she is interested in good sequences. A sequence x1, x2, ..., xk is calledgood if it satisfies the following three conditions:

  • The sequence is strictly increasing, i.e. xi < xi + 1 for eachi (1 ≤ i ≤ k - 1).
  • No two adjacent elements are coprime, i.e. gcd(xi, xi + 1) > 1 for eachi (1 ≤ i ≤ k - 1) (wheregcd(p, q) denotes the greatest common divisor of the integersp and q).
  • All elements of the sequence are good integers.

Find the length of the longest good sequence.

Input

The input consists of two lines. The first line contains a single integer n (1 ≤ n ≤ 105) — the number of good integers. The second line contains a single-space separated list of good integersa1, a2, ..., an in strictly increasing order (1 ≤ ai ≤ 105ai < ai + 1).

Output

Print a single integer — the length of the longest good sequence.

Examples
Input
52 3 4 6 9
Output
4
Input
91 2 3 5 6 7 8 9 10
Output
4
Note

In the first example, the following sequences are examples of good sequences: [2; 4; 6; 9], [2; 4; 6], [3; 9], [6]. The length of the longest good sequence is 4.


题目大意:

给你一个长度为N的序列,让你找到其中一个严格递增的子序列,使得其长度最长,并且按序相邻的两个元素不互质。(本身序列就是严格递增的);


思路:


1、思路来源:http://blog.csdn.net/joy_go/article/details/8534940


2、蛮巧妙的一个做法:

①设定dp【i】表示以因子i结尾的最长子序列长度。

②预处理出N个数的所有因子,存入vector中(不处理1)。

③然后O(n)扫这个序列,当扫到第i个数的时候,对应将第i个数的因子都取出来,dp【因子】++,表示以这个因子作为结尾的子序列长度增加了1.然后在这个过程中维护一个最大值,设定为maxn;

④然后再对应第i个数的因子再取出来一遍,对应dp【因子】=maxn,表示现在以第i个数结尾的同时,以任何因子结尾的长度都是当前这个maxn长度。然后进行下一位的处理。

⑤那么此时我们的解就是max(dp【i】)【2<=i<=a【n】】(因为a【n】一定是序列中最大的数,所以最大的因子也就是a【n】)


Ac代码:

#include<stdio.h>#include<string.h>#include<vector>#include<math.h>using namespace std;vector<int >yinzi[100040];int dp[100040];int a[100040];int main(){    int n;    while(~scanf("%d",&n))    {        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)yinzi[i].clear();        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            yinzi[i].push_back(a[i]);            for(int j=2;j<=(int)(sqrt(a[i]));j++)            {                if(a[i]%j==0)                {                    if(j*j==a[i])                    {                        yinzi[i].push_back(j);                        continue;                    }                    yinzi[i].push_back(j);                    yinzi[i].push_back(a[i]/j);                }            }        }        for(int i=1;i<=n;i++)        {            int maxn=0;            for(int j=0;j<yinzi[i].size();j++)            {                dp[yinzi[i][j]]++;                maxn=max(maxn,dp[yinzi[i][j]]);            }            for(int j=0;j<yinzi[i].size();j++)            {                dp[yinzi[i][j]]=maxn;            }        }        int output=0;        for(int i=1;i<=a[n];i++)        {            output=max(dp[i],output);        }        printf("%d\n",output);    }}





0 0
原创粉丝点击