(Jizhong) 1599] GDKOI2004 녹나무 (장뇌) 긴 시퀀스 최적화 + 떨어 뜨리지 않는다]

(IO 파일) : 입력 : camphor.in의 출력을 : camphor.out의
시간 제한 : 1000 MS 공간 제약을 : 131,072킬로바이트의 특정 제한
고토 ProblemSet을


제목 설명
녹나무 나무, 결코 포플러의 얼룩덜룩 한 반점을 분할하지, 질감은 매우 균일 네 유명한 강남 매우 독특한, 그것의 거친 껍질로 알려져, 버드 나무 종양은 더 결절 없습니다 하위 지점 트렁크 네 먼 길에 두, 두, 이동 잘라 모서리 불필요한되지 않습니다하지 마십시오 왕관 모양은 구형이며, 하늘의 우아한 곡선을 그립니다. 위의 장점뿐만 아니라, 녹나무 비밀 무기를 가지고있다. 간단한으로 ........................ 즉, 무거운 좋은 캐릭터는 작은 여우의 호의를 승리! ! ! 어느 날, 작은 호수 여우는 바람이 불고 갑자기 돌풍의 모든 걷고 있다고 말하고, 그녀는 눈을 감고 서둘러. 그녀는 다시 그녀의 눈을 열어 더 녹나무의 깔끔한 행 중 아름다운 호반을 발견했을 때. 작은 여우는 매우 그녀가 각 나무의 관찰력이다, 흥분, 그들의 잎의 수의 수입니다. 그녀는 두 나무 인접한 소수의 잎의 수는 부조화 될 경우 느꼈다. 따라서 두 개의 인접한 나무의 잎의 수를 만족하는 조건 하에서, 녹나무의 복수의 선택된 로우 같은 작은 여우가 서로 소되지 않도록 트리 가능성만큼.


입력
첫 번째 줄을 양의 정수를 표명 녹나무. 두번째 라인 양의 정수의 나는 나는 숫자는 내가 녹나무 나무의 잎의 수를 나타냅니다.

출력
선거에 얼마나 많은 나무를 나타내는 양의 정수.


샘플 입력
. 6
. 6 8 15 5 2 3

출력 샘플
4


데이터 범위 제한
에 대한 (60) (60) %의 데이터 < = 1,000 N <1000 =     
들어 (100) (100) 데이터 % < = 100000 N <= 100000 , 잎의 수 < = 100000 <= 100000
주 : 제 선택한 경우 선택된 트리, 즉 그 위치를 변경할 수없는 ( 1 , , ... ... ) (T1, T2, T3 ...... TN) 목, 상기 1 < < < ... ... < T1 <T2 <T3 <...... <TN 고려를 나는 TI 나는 + 1 TI + 1 인접.



선택 1 1 , 제 제, 4 4 일본 제 6 6 트리


아이디어를 문제 해결
우리가 가장 긴 드롭 순서 중 하나입니다 찾을 수 없습니다! ! ! 우리 것이다 단지 조건 a [ i ] > = a [ j ] A [I]> = A [J] a [ i ] a [ j ] A [I], A [J] 이고 최대 공약수를 초과 한 있지만 60 (60) 점. . 사실, 우리는 할 수 j 제이 1 i 1 1 내지 I-1 변경 i l o g ( i ) 2 i 1 I-로그 (I) * 2 到 I-1 , 그것은 시간이 초과되지 않습니다,하지만 왜 나 한테 물어하지 않습니다. .
A C AC ~에서 이동합니다


코드

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int a[100010],n,f[100010],ans;
int check(int x,int y)
{
     if(x%y==0)
	return y;
     else
	return check(y,x%y);
}
int log(int x){
    int t=0;
    while(x>0)
    {
	x=x/2;
	t++;
     }
    return t;
}
int main(){
    freopen("camphor.in","r",stdin);
    freopen("camphor.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
	scanf("%d",&a[i]);
	f[i]=1;
    }
    for(int i=2;i<=n;i++)
    {
	for(int j=i-log(i)*2;j<=i-1;j++)
		if (j>0)
	    	if(check(a[i],a[j])>1)
			    f[i]=max(f[i],f[j]+1);
    }
    for(int i=1;i<=n;i++)
        if(f[i]>ans) 
	   ans=f[i];
    printf("%d",ans);
}
게시 된 119 개 원래 기사 · 원 찬양 8 · 전망 4906

추천

출처blog.csdn.net/kejin2019/article/details/105013833