(紀中)1599. 【GDKOI2004】香樟樹(camphor)【最長不下降子序列+優化】

(File IO): input:camphor.in output:camphor.out
時間限制: 1000 ms 空間限制: 131072 KB 具體限制
Goto ProblemSet


題目描述
被譽爲江南四大名木之一的香樟樹很有特色,它的樹皮粗糙,質地卻很均勻,從來沒有白楊樹的斑斑駁駁、沒有柳樹的腫瘤結節;樹枝樹幹一分爲二、二分爲四一路長去,不會偷工減料也不會畫蛇添足;樹冠的形態是球形的,在天空中畫出優美的曲線。 除了上述優點之外,香樟樹還有一個祕密武器。那就是……………………它憑藉樸實、厚重的優秀品格贏得了小狐狸的青睞!!! 話說有一天,小狐狸正在湖邊散步,忽然一陣風吹來,她趕緊閉上眼睛。當她再次睜開眼睛時,發現美麗的湖畔多出了一排整齊的香樟樹。小狐狸非常興奮,她對每棵樹都觀察入微,並且數出了它們的葉子個數。她覺得如果相鄰兩棵樹的葉子個數互素是不和諧的。因此小狐狸想從一排香樟樹中選出若干棵,在滿足相鄰兩棵樹的葉子個數不互素的條件下,使得樹儘量多。


輸入
第一行一個正整數nn,表示有nn棵香樟樹。 第二行nn個正整數,第ii個數表示第i棵香樟樹葉子的個數。

輸出
一個正整數,表示最多能選多少棵樹。


樣例輸入
6
6 2 3 15 8 5

樣例輸出
4


數據範圍限制
對於6060%的數據n<=1000n<=1000     
對於100100%的數據n<=100000n<=100000,葉子個數<=100000<=100000
注意:選中的樹不能改變其位置,即如果選中第(t1t2t3tn)(t1,t2,t3……tn)棵樹 ,其中t1<t2<t3<<tnt1<t2<t3<……<tn則認爲tititi+1ti+1相鄰。


提示
選擇第11、第33、第44和第66棵樹


解題思路
我們可以發現這就是一個最長不下降子序列!!!,我們只要將條件a[i]>=a[j]a[i]>=a[j]改成a[i]a[j]a[i],a[j]的最大公約數大於一,然而只有6060分。。其實我們可以將jj1i11到i-1改成ilog(i)2i1i-log(i)*2 到i-1,就不會超時了,但不要問我爲什麼。。
ACAC走起~~~


代碼

#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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章