首先通過初步閱讀題目,就可以發現這是乙個關於排列組合的問題,但仔細研讀以及通過閱讀題解後發現,這裡存在乙個隱含的條件,例如1->2,2->3,那麼1也可以通過兩次變化變成3,這裡就可以初步發現這個問題實際已經轉化成了乙個圖論的問題,翻譯一下就是有若干個城市,現在已知若干條道路可以將其中的一些城市連線起來,問你其中全部可以互相到達的城市,這裡就可以用到弗洛伊德演算法。`
inline
void
floyd()
這大概就是乙個最最基礎的弗洛伊德演算法的模型,簡單解釋一下就是看看i,j之間是否通過k之間可以聯絡起來。我個人覺得這裡最需要注意的一點是中間值k要放在最開始進行遍歷。
然後這裡還要用到高精度的一些東西,因為這裡的資料範圍已經遠遠超過了long long 所以必須要用到高精度的東西。
int len =
2; num[1]
=1;for
(int i =
0;i <
(int
)str.
length()
;i++
)//這裡是你輸入的這個數的長度
while
(num[len]
) len++
;//求出長度
}for
(int i = len-
1;i >=
1;i--
) cout << num[i]
;//輸出
總結起來就是一句話,先是用弗洛伊德演算法算出每個數與之相連(包括它本身)數的個數,然後實際上就是遍歷你輸入的這段數,把他們對應相連數的個數全部乘起來即可,就算沒有數與之相連,那麼就是1,不影響最終的結果。最後貼上完整**
#include
#include
using
namespace std;
string str;
int k,vis[10]
[10],f[10]
,num[
101]
;inline
void
floyd()
int main (
)for
(int i =
0;i <=
9;i++
) vis[i]
[i]=
true
;//自己可以變成自己
floyd()
;for
(int i =
0;i <=
9;i++
)for
(int j =
0;j <=
9;j++)if
(vis[i]
[j]) f[i]++;
//求出i可以變成多少種數字
int len =
2; num[1]
=1;for
(int i =
0;i <
(int
)str.
length()
;i++
)while
(num[len]
) len++
;//求出長度
}for
(int i = len-
1;i >=
1;i--
) cout << num[i]
;//輸出
return0;
}
弗洛伊德演算法
弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...
弗洛伊德演算法
floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...
弗洛伊德演算法
弗洛伊德演算法 求任意一點i到任意一點j的最短路。分析 求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於 把群舉法 通過修改 進行分類,得到好的演算法。flod演算法的分類標準是 通過i到j過點的情況進行...