算法提高 分分鐘的碎碎念

算法提高 分分鐘的碎碎念

以前有個孩子,他分分鐘都在碎碎念。不過,他的念頭之間是有因果關係的。他會在本子裏記錄每一個念頭,並用箭頭畫出這個念頭的來源於之前的哪一個念頭。翻開這個本子,你一定會被互相穿梭的箭頭給攪暈,現在他希望你用程序計算出這些念頭中最長的一條因果鏈。

將念頭從1到n編號,念頭i來源於念頭from[i],保證from[i]<i,from[i]=0表示該念頭沒有來源念頭,只是腦袋一抽,靈光一現。

輸入格式:

第一行一個正整數n表示念頭的數量

接下來n行依次給出from[1],from[2],…,from[n]

輸出格式:

共一行,一個正整數L表示最長的念頭因果鏈中的念頭數量

輸入樣例:

在這裏給出一組輸入。例如:

8
0
1
0
3
2
4
2
4

輸出樣例:

在這裏給出相應的輸出。例如:

3

樣例說明

最長的因果鏈有:

1->2->5 (from[5]=2,from[2]=1,from[1]=0)

1->2->7 (from[7]=2,from[2]=1,from[1]=0)

3->4->6 (from[6]=4,from[4]=3,from[3]=0)

3->4->8 (from[8]=4,from[4]=3,from[3]=0)

數據規模和約定1<=n<=1000

思路:

這道題可以用遞歸來做,定義一個數組arr來存所有的念頭,dfs函數有兩個參數,n:表示當前的念頭,cnt記錄長度。從1到N(碎碎唸的總長度)循環,若arr[i]=n(第i個念頭來自於n),繼續遞歸dsf(i,cnt+1),最後記錄cnt即得到最大長度。

代碼:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int arr[1001];
int N, mmax = 0;
void dfs(int n, int cnt)
{
	int i;
	for (i = 1; i <= N; i++)
	{
		if (arr[i] == n)
			dfs(i, cnt + 1);
	}
	mmax = max(mmax,cnt);
}
int main()
{
	cin >> N;
	for (int i = 1; i <= N; i++)
	{
		cin >> arr[i];
	}
	dfs(0, 0);
	cout << mmax << endl;
    return 0;
}
發佈了55 篇原創文章 · 獲贊 8 · 訪問量 4000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章