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 }