(File IO): input:camphor.in output:camphor.out
時間限制: 1000 ms 空間限制: 131072 KB 具體限制
Goto ProblemSet
題目描述
被譽爲江南四大名木之一的香樟樹很有特色,它的樹皮粗糙,質地卻很均勻,從來沒有白楊樹的斑斑駁駁、沒有柳樹的腫瘤結節;樹枝樹幹一分爲二、二分爲四一路長去,不會偷工減料也不會畫蛇添足;樹冠的形態是球形的,在天空中畫出優美的曲線。 除了上述優點之外,香樟樹還有一個祕密武器。那就是……………………它憑藉樸實、厚重的優秀品格贏得了小狐狸的青睞!!! 話說有一天,小狐狸正在湖邊散步,忽然一陣風吹來,她趕緊閉上眼睛。當她再次睜開眼睛時,發現美麗的湖畔多出了一排整齊的香樟樹。小狐狸非常興奮,她對每棵樹都觀察入微,並且數出了它們的葉子個數。她覺得如果相鄰兩棵樹的葉子個數互素是不和諧的。因此小狐狸想從一排香樟樹中選出若干棵,在滿足相鄰兩棵樹的葉子個數不互素的條件下,使得樹儘量多。
輸入
第一行一個正整數,表示有棵香樟樹。 第二行個正整數,第個數表示第i棵香樟樹葉子的個數。
輸出
一個正整數,表示最多能選多少棵樹。
樣例輸入
6
6 2 3 15 8 5
樣例輸出
4
數據範圍限制
對於%的數據
對於%的數據,葉子個數
注意:選中的樹不能改變其位置,即如果選中第棵樹 ,其中則認爲與相鄰。
提示
選擇第、第、第和第棵樹
解題思路
我們可以發現這就是一個最長不下降子序列!!!,我們只要將條件改成的最大公約數大於一,然而只有分。。其實我們可以將的改成,就不會超時了,但不要問我爲什麼。。
走起~~~
代碼
#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);
}