CodeForces 264B Good Sequences :给定n的序列,找出最长的(相邻元素不互质)的子序列: dp

这道题目自己能想到还是挺开心的=

我的做法是先用筛法将每个数的质数因子放到这个数对应的vector里面

然后从首至尾扫这个数组,对每个数查看他的所有质因子最大的长度,最后更新每个质因子的长度,复杂度大概是O(n*数的质因子平均个数),挺快的

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 vector<int>p[100005];
 7 int vis[100005],dp[100005],maxx[100005];
 8 int main()
 9 {
10   int i,j,n,x,max_tmp;
11   for (i=0;i<=100000;i++) p[i].clear();
12   memset(vis,0,sizeof(vis)); vis[1]=1;
13   for (i=2;i<=100000;i++)
14     if (vis[i]==0){
15       for (j=1;i*j<=100000;j++)
16       {
17         vis[i*j]=1;
18         p[i*j].push_back(i);
19       }
20     }
21   memset(maxx,0,sizeof(maxx));
22   memset(dp,0,sizeof(dp));
23   scanf("%d",&n);
24   for (i=1;i<=n;i++)
25   {
26     scanf("%d",&x);
27     max_tmp=0;
28     for (j=0;j<p[x].size();j++)
29       max_tmp=max(max_tmp,maxx[p[x][j]]);
30     dp[i]=max_tmp+1;
31     for (j=0;j<p[x].size();j++)
32       maxx[p[x][j]]=max(maxx[p[x][j]],dp[i]);
33   }
34   max_tmp=0;
35   for (i=1;i<=n;i++)
36     max_tmp=max(max_tmp,dp[i]);
37   printf("%d\n",max_tmp);
38 }
View Code

题目链接:http://codeforces.com/problemset/problem/264/B

posted on 2015-03-26 12:05  xiao_xin  阅读(636)  评论(0编辑  收藏  举报

导航