題目概述:
給定n張卡,求將這n張卡分為1~n堆的所有分法之和。
大致思路:
顯然應該是數學題。
首先應該確定所有的分組情況,比如n=2時可以分為兩組每組一張卡或一組兩張卡,對於確定分組情況,我們可以用求和的方式表示,如:
4=1+1+1+1
4=2+1+1
4=2+2
4=3+1
4=4可以表示n=4時的所有情況。實際上此時已經可以求出正確答案了,只需要對每種分組情況用組合數求解方案最後求和就能求出正確答案。
but,這樣做程式設計複雜度高的可怕!!(反正以我的能力做不到),so我們需要簡化一下我們得到的結論。
從簡單的例子開始:
當n=2時,所有的方案為: 當n=3時,所有的方案為:
, ,,,,
,可以發現,對於n-1時分為兩組的乙個方案在n時變為了三個方案,而分為一組的乙個方案在n時變為了兩個方案。
記f(i,j)為將i分為j組的所有方案數,則n時的所有方案為:
這時只需要求出f(i,j)就能求出ans(n)了。
考慮用遞推來求f(i,j).
邊界條件為:f(i,1)=f(i,i)=1
複雜度分析:
求f陣列的複雜度為o(n²),求ans的複雜度為o(n*t),t為資料組數,所以總複雜度當t比n大時為o(n*t),反之為o(n²)。
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9using
namespace
std;
1011
#define sacnf scanf
12#define maxn 2010
13#define inf 0x7fffff
14#define eps 0.001
15#define mod 1000
16void swap(int &a,int &b)
17 typedef long
long
ll;18 typedef unsigned int
uint;19
20int
f[maxn][maxn];
2122
void
init()
2331}32
}3334int
main()
3546
return0;
47 }
解題報告 數學
1 函式 又是函式 問題描述 話說leve最最最討厭數學,每次考試都因為數學悲劇 大頭頭還極其可惡的冒天下之大不韙的讓同學們把那本16開500頁的2012高考數學核按鈕做完 為什麼要叫核按鈕呢?你懂得 現在,leve被一道函式題難住了,為了省出更多的時間學oi,她把這道題交給了你。給定乙個函式f x...
hdoj 1153 解題報告
題目意思 有乙個城鎮,它的所有街道都是單行的,並且每條街道都是和兩個路口相連。同時已知街道不會形成迴路。你的任務是編寫程式求最小數量的傘兵,這些傘兵可以訪問 visit 所有的路口。對於傘兵的起始降落點不做限制。解題思路 這個題轉化成求dag圖的最小路徑覆蓋數 節點數 最大匹配數。其中求最大匹配是關...
HDOJ 1047解題報告
練習acm後的第一篇解題報告。這題是求大數階乘的,題目要求最大能求10000的階乘。剛一看到這題,感覺思路很簡單,思考了一會之後就開始寫 思路很簡單,由於是大數乘法,普通的int型別肯定不夠用,要用陣列儲存。然後運算過程就是最簡單的乘法運算過程,乘 移位 加 的簡單過程。提交之後一直是tle,悲劇,...