2020寒假【gmoj1599】【GDKOI2004】【香樟樹camphor】【最長不下降子序列+優化】

題目描述

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

輸入

第一行一個正整數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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章