題目描述
被譽爲江南四大名木之一的香樟樹很有特色,它的樹皮粗糙,質地卻很均勻,從來沒有白楊樹的斑斑駁駁、沒有柳樹的腫瘤結節;樹枝樹幹一分爲二、二分爲四一路長去,不會偷工減料也不會畫蛇添足;樹冠的形態是球形的,在天空中畫出優美的曲線。 除了上述優點之外,香樟樹還有一個祕密武器。那就是………它憑藉樸實、厚重的優秀品格贏得了小狐狸的青睞!!! 話說有一天,小狐狸正在湖邊散步,忽然一陣風吹來,她趕緊閉上眼睛。當她再次睜開眼睛時,發現美麗的湖畔多出了一排整齊的香樟樹。小狐狸非常興奮,她對每棵樹都觀察入微,並且數出了它們的葉子個數。她覺得如果相鄰兩棵樹的葉子個數互素是不和諧的。因此小狐狸想從一排香樟樹中選出若干棵,在滿足相鄰兩棵樹的葉子個數不互素的條件下,使得樹儘量多。
輸入
第一行一個正整數n,表示有n棵香樟樹。 第二行n個正整數,第i個數表示第i棵香樟樹葉子的個數。
輸出
一個正整數,表示最多能選多少棵樹。
樣例輸入
6
6 2 3 15 8 5
樣例輸出
4
數據範圍限制
對於60%的數據n<=1000
對於100%的數據 n<=100000,葉子個數<=100000
注意:選中的樹不能改變其位置,即如果選中第(t1,t2,t3……tn)棵樹 ,其中t1<t2<t3<……<tn則認爲ti與ti+1相鄰。
提示
選擇第1、第3、第4和第6棵樹
分析
其實就是類似最長不下降子序列!!!只是“不下降”的條件變化了,變成a[i]和a[j]的最大公因數大於1,而不是a[i]>a[j]。但是超時60pts。
咋優化?玄學!!
只要把j的1到i−1 改成i−log(i)∗2到i−1,就不會超時了…神奇qwq,我也不知爲啥。。
上代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100010],n,f[100010],ans;
int zdgys(int x,int y)
{
if(x%y==0) return y;
else return zdgys(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);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>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(zdgys(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];
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}