codeforces 264B Good Sequences

来源:互联网 发布:手机宠物软件 编辑:程序博客网 时间:2024/06/04 23:30

codeforces 264B Good Sequences

  1. 题目链接
  2. 题目大意:在给出的一个单调递增的数列中,求出最长子序列(该子串相邻两个元素不互质)的长度
  3. 解题思路:在周赛的时候没有做出来,后来看了题解代码才明白。首先要开一个vector组,vector[i]中存的是i的所有因数,dp[i]的意思是因数含有i的最长子序列的长度。每次进来一个数我们就更新一遍这个数的因数所对的最长子序列的长度
  4. 代码参考了http://blog.csdn.net/yu_ch_sh/article/details/50359497
#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#define maxn 100005using namespace std;vector<int> vc[maxn];//vc[i]存的是i的因数void init(){        int i,j;        for(i=2;i<=maxn;i++)        {                for(j=i;j<=maxn;j+=i)                {                        vc[j].push_back(i);//j的因数有i                }        }}int a[maxn],dp[maxn];//dp[i]是以因数i结尾的最长子串的长度int main(){        int n,i,j;        init();        while(~scanf("%d",&n)){        for(i=1;i<=n;i++)        scanf("%d",&a[i]);        vector<int>::iterator it;        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        {                int temp=0;                for(it=vc[a[i]].begin();it!=vc[a[i]].end();it++)//这个地方非常容易错                {                        temp=max(temp,dp[*it]);                }                for(it=vc[a[i]].begin();it!=vc[a[i]].end();it++)                {                        dp[*it]=temp+1;                }        }        int ans=1;        for(i=2;i<=maxn;i++)        {                ans=max(ans,dp[i]);                //printf("%d ",dp[i]);        }        printf("%d\n",ans);        }        return 0;}
原创粉丝点击