zoukankan      html  css  js  c++  java
  • CF264B Good Sequences

      传送门

    Description:

    松鼠丽丝特别喜欢n个她称之为“好整数”的整数:a1,a2,……,an。(会输入)

    现在,她对“好序列”很感兴趣。如果一个序列x1,x2,...,xk能够满足一下三个条件,那就是一个“好序列”:

    1.该序列是严格上升的,即x[i]<x[i+1](1<=i<=k-1)

    2.任意两个相邻的元素是非互质的,即gcd(x[i],x[i+1])>1 (1<=i<=k-1) (gcd即最大公约数)

    3.所有的数字都是“好整数”

    现在,请你找出长度最长的“好序列”

    暴力DP解法:(当然不是AC做法)

      就是很像导弹拦截

      dp[i]表示以编号为i的好数结尾的最长好序列

      枚举判断转移就OK啦

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #define R register
     5 #define go(i,a,b) for(R int i=a;i<=b;i++)
     6 #define ll long long
     7 #define M 100000
     8 using namespace std;
     9 int read()
    10 {
    11     int x=0,y=1;char c=getchar();
    12     while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
    13     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    14     return x*y;
    15 }
    16 int n,a[M],dp[M],ans;
    17 int gcd(int x,int y)
    18 {
    19     return x%y==0?y:gcd(y,x%y);
    20 }
    21 int main()
    22 {
    23     n=read();
    24     go(i,1,n) a[i]=read(),dp[i]=1;
    25     sort(a+1,a+n+1);
    26     go(i,1,n) 
    27     {
    28         go(j,1,i-1) if(gcd(a[i],a[j])>1) dp[i]=max(dp[i],dp[j]+1);
    29         ans=max(ans,dp[i]);
    30     }
    31     printf("%d",ans);
    32 }
    暴力DP Code

    正解:

      之前的n2转移是枚举判断两个数是否互质

      如果两个数之间不互质其实就是有除了1以外的公因数

      我们发现a[i]是小于等于105

      所以可以记录b[i]为以i为因数的好数结尾的好序列的最大长度

      具体见代码 很好懂的啦

    CODE:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 #define R register
     6 #define go(i,a,b) for(R int i=a;i<=b;i++)
     7 #define ll long long
     8 #define M 100000+10
     9 using namespace std;
    10 int read()
    11 {
    12     int x=0,y=1;char c=getchar();
    13     while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
    14     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    15     return x*y;
    16 }
    17 int n,a[M],b[M],dp[M],ans;
    18 int main()
    19 {
    20     n=read();
    21     go(i,1,n) a[i]=read(),dp[i]=1;
    22     sort(a+1,a+n+1);
    23     go(i,1,n) 
    24     {
    25         int x=a[i],maxn=sqrt(a[i])+1;
    26         go(j,2,maxn) 
    27         {
    28             if(x%j==0) dp[i]=max(dp[i],b[j]+1);
    29             while(x%j==0) x/=j;
    30         }
    31         if(x>1) dp[i]=max(dp[i],b[x]+1);
    32         x=a[i];
    33         go(j,2,maxn) 
    34         {
    35             if(x%j==0) b[j]=dp[i];
    36             while(x%j==0) x/=j;
    37         }
    38         if(x>1) b[x]=dp[i];
    39         ans=max(ans,dp[i]);
    40     }
    41     printf("%d",ans);
    42 }
    View Code
    光伴随的阴影
  • 相关阅读:
    c#基础问题笔记(一)
    自动化技术中的进给电气传动研习笔记2
    自动化技术中的进给电气传动研习笔记1
    汉字在电脑中是如何存储与编码的呢?
    三十分钟掌握STL
    python练习:函数2
    python练习:函数3
    Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form ResumeForm needs updating.
    vue 数组对象取对象的属性: Cannot read property 'xxxx' of undefined
    python练习:函数4
  • 原文地址:https://www.cnblogs.com/forward777/p/10350829.html
Copyright © 2011-2022 走看看