1. 程式人生 > >HDU 5366:The mook jong 遞推

HDU 5366:The mook jong 遞推

hdu ons accep ucc soft cst stream mil overflow

The mook jong

Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 問題描寫敘述
ZJiaQ為了強身健體。決定通過木人樁練習武術。

ZJiaQ希望把木人樁擺在自家的那個由1*1的地磚鋪成的1*n的院子裏。

因為ZJiaQ是個強迫癥,所以他要把一個木人樁正好擺在一個地磚上,因為木人樁手比較長。所以兩個木人樁之間地磚必須大於等於兩個,如今ZJiaQ想知道在至少擺放一個木人樁的情況下,有多少種擺法。

輸入描寫敘述
輸入有多組數據。每組數據第一行為一個整數n(1 < = n < = 60)
輸出描寫敘述
對於每組數據輸出一行表示擺放方案數
輸入例子
1	
2
3
4
5
6
輸出例子
1
2
3
5
8
12
這個題目有一個遞推關系就是f[n]=f[n-1]+f[n-3]+1 怎麽來的呢。就是當1*n-1個格子擴展到1*n的格子時, 當多出來的那一個格子為0時,數量=f[n-1] 當多出來的那一個格子為1時,數量=f[n-3]再加上新來的那個為1的格子,多了一種排法,即f[n-3]+1 事實上一個循環全然能夠做,但當時著急對著這個公式寫了一個遞歸,結果到五十幾的時候出不來結果 ,太慢了,索性由於輸入也不多就直接打表。。。 代碼:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

int num;
long long a[65];

int main()
{
	a[1]=1;
	a[2]=2;
	a[3]=3;
	a[4]=5;
	a[5]=8;
	a[6]=12;
	a[7]=18;
	a[8]=27;
	a[9]=40;
	a[10]=59;
	a[11]=87;
	a[12]=128;
	a[13]=188;
	a[14]=276;
	a[15]=405;
	a[16]=594;
	a[17]=871;
	a[18]=1277;
	a[19]=1872;
	a[20]=2744;
	a[21]=4022;
	a[22]=5895;
	a[23]=8640;
	a[24]=12663;
	a[25]=18559;
	a[26]=27200;
	a[27]=39864;
	a[28]=58424;
	a[29]=85625;
	a[30]=125490;
	a[31]=183915;
	a[32]=269541;
	a[33]=395032;
	a[34]=578948;
	a[35]=848490;
	a[36]=1243523;
	a[37]=1822472;
	a[38]=2670963;
	a[39]=3914487;
	a[40]=5736960;
	a[41]=8407924;
	a[42]=12322412;
	a[43]=18059373;
	a[44]=26467298;
	a[45]=38789711;
	a[46]=56849085;
	a[47]=83316384;
	a[48]=122106096;
	a[49]=178955182;
	a[50]=262271567;
	a[51]=384377664;
	a[52]=563332847;
	a[53]=825604415;
	a[54]=1209982080;
	a[55]=a[54]+a[52]+1;
	a[56]=a[55]+a[53]+1;
	a[57]=a[56]+a[54]+1;
	a[58]=a[57]+a[55]+1;
	a[59]=a[58]+a[56]+1;
	a[60]=a[59]+a[57]+1;
	while(cin>>num)
	{
		cout<<a[num]<<endl;
	}

	return 0;
}





HDU 5366:The mook jong 遞推