日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

ACM训练赛--递推专题

發(fā)布時(shí)間:2025/6/15 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM训练赛--递推专题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1001: Buy the Ticket

Problem Description

The "Harry Potter and the Goblet of Fire" will be on show in the next few days. As a crazy fan of Harry Potter, you will go to the cinema and have the first sight, won’t you?

Suppose the cinema only has one ticket-office and the price for per-ticket is 50 dollars. The queue for buying the tickets is consisted of m + n persons (m persons each only has the 50-dollar bill and n persons each only has the 100-dollar bill).

Now the problem for you is to calculate the number of different ways of the queue that the buying process won't be stopped from the first person till the last person.

Note: initially the ticket-office has no money.

The buying process will be stopped on the occasion that the ticket-office has no 50-dollar bill but the first person of the queue only has the 100-dollar bill.

Input

The input file contains several test cases. Each test case is made up of two integer numbers: m and n. It is terminated by m = n = 0. Otherwise, m, n <=100.

Output

For each test case, first print the test number (counting from 1) in one line, then output the number of different ways in another line.

Sample Input

3 0

3 1

3 3

0 0

Sample Output

Test #1:

6

Test #2:

18

Test #3:

180

Source

HUANG, Ninghai

?

題目分析:

?

題目大意:

電影院買票,收銀臺(tái)沒(méi)有零錢,而排隊(duì)買票的人手里拿著的都是100元或是50元,每張票50元,給出拿100或50的各自人數(shù),求出有幾種排列方法使得收銀臺(tái)不會(huì)因找不出錢而停止!

?

我的思路:

設(shè)m張50元n張100元時(shí)的排列方法有f(m,n)種,總?cè)藬?shù)為m+n;當(dāng)總?cè)藬?shù)為m+n-1時(shí),有兩種情況:

(1)m少1。此時(shí)必須要滿足m>n(若m=n,則m-1< P>

(2)n少1。排列方法有f(m,n-1)種。當(dāng)n-1多1時(shí),同理有n*f(m,n-1)種方法。

由以上兩種情況得到遞推公式:

當(dāng)m=n時(shí),f(m,n)=n*f(m,n-1);

當(dāng)m>n時(shí),f(m,n)=m*f(m-1,n)+n*f(m,n-1);

當(dāng)m<n時(shí),f(m,n)=0.

下一步就要確定初始條件:

當(dāng)m=1, n=0時(shí),f(m,n)=1; 當(dāng)m=1, n=1時(shí),f(m,n)=1.

另外,由于本題的數(shù)據(jù)比較大,必須要用高精度,而且遞歸會(huì)超時(shí),要用數(shù)組來(lái)保存數(shù)據(jù)。那么,選用哪種類型的數(shù)組比較好呢?很顯然,本題涉及到很大的運(yùn)算量,用整型的數(shù)組比較好。于是,用f[m][n][]代表f(m,n)。

?

以下是我的代碼:

?

#include<stdio.h>

#define c 51????????????????????? //定義數(shù)組的長(zhǎng)度

#define d 100000000??????? //定義常量,用于整型數(shù)組的數(shù)據(jù)處理

int main()

{

??? int m,n,i,j,k,t=1,temp=0,f1,f2;

??? __int64 ff;

??? int f[101][101][c]={0};???????????????????????? //數(shù)組初始化為0

??? f[1][0][0]=1;????????????????????????????????????????? //初始條件

??? f[1][1][0]=1; ??????????????????????????????????????? //初始條件

??? for(i=2;i<=100;i++)

????? for(j=0;j<=i;j++)

??????? {

???????? for(k=0;k<c;k++)

?????????? if(j==i)

?????????? {

??????????? ff=(__int64)j*f[i][j-1][k]+temp;?? //注意,當(dāng)數(shù)據(jù)比較大時(shí),

??????????? if((ff>d)&&(k<c-1))??????????????????? // j*f[i][j-1][k]會(huì)超出整型的范圍,

??????????? {?????????????????????????????????????????????????? //故用(__int64)強(qiáng)制類型轉(zhuǎn)換

????????????? temp=ff/d;???????????????????????????????

????????????? ff%=d;

????????????? f[i][j][k]=(int)ff;

??????????? }

??????????? else f[i][j][k]=(int)ff,temp=0;

?????????? }

?????????? else

?????????? {

??????????? ff=(__int64)i*f[i-1][j][k]+(__int64)j*f[i][j-1][k]+temp;

??????????? if((ff>d)&&(k<c-1))

??????????? {

????????????? temp=ff/d;

????????????? ff%=d;

????????????? f[i][j][k]=(int)ff;

??????????? }

??????????? else f[i][j][k]=(int)ff,temp=0;

?????????? }

?? ??????}

??? while(scanf("%d%d",&m,&n)!=EOF&&((m!=0)||(n!=0)))

??? {

?????? printf("Test #%d:\n",t++);

?????? for(i=c-1;i>0;i--)if(f[m][n][i]!=0)break;? //去掉數(shù)據(jù)中無(wú)效的0

?????? printf("%d",f[m][n][i]);

?????? for(j=i-1;j>=0;j--)printf("%08d",f[m][n][j]);??????? //%08d中08表示輸出的數(shù)

?????? printf("\n");?????????????????????????????????????????????????????????? //據(jù)占8位,這是因?yàn)槟?/strong>

??? }???????????????????????????????????????????????????????????????????????????????? //100000000后,保存的數(shù)據(jù)

??? return 0;????????????????????????????????????????????????????????????????????? //只有8位

}?

PS:此題用了個(gè)3維的數(shù)組,占用的空間比較大,可以考慮用兩個(gè)2維的數(shù)組代替。另外,此題用C++提交會(huì)超時(shí)且堆棧溢出,而用G++提交則不會(huì),這說(shuō)明本代碼不優(yōu),同時(shí)也間接說(shuō)明了用G++提交代碼的好處。

?

?

?

?

?

?

?

1002:Tri Tiling

Problem Description

In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle.

?

?Input

Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer 0 ≤ n ≤ 30.

Output

For each test case, output one integer number giving the number of possible tilings.

Sample Input

2

8

12

-1

Sample Output

3

153

2131

Source

University of Waterloo Local Contest 2005.09.24

?

題目分析:

?

題目大意:

用2*1大小的多米諾骨排蓋3*n的矩形,問(wèn)有多少種蓋法。

?

我的思路:

首先可以看出,當(dāng)n為奇數(shù)時(shí),無(wú)論怎么蓋也不會(huì)蓋成3*n的矩形,故只需考慮n為偶數(shù)即可。可以將此題抽象為一個(gè)3*n的矩陣,用f(a,b,c)代表有多少種蓋法,其中a,b,c分別代表第1、2、3行的元素個(gè)數(shù),由此推導(dǎo)遞歸公式。假設(shè)第n列已蓋好,那么它可由以下幾種情況組成:

(1)??? 橫放3個(gè),此時(shí)f(a,b,c)=f(a-2,b-2,c-2);

(2)??? 豎放1個(gè),橫放1個(gè),此時(shí)f(a,b,c)=f(a-1,b-1,c-2);

(3)??? 橫放1個(gè),豎放1個(gè),此種情況與(2)對(duì)稱,故仍可用f(a,b,c)=f(a-1,b-1,c-2)。

?

于是得遞推公式:

當(dāng)a=b=c時(shí),f(a,b,c)= 2*f(a-2,b-1,c-1)+f(a-2,b-2,c-2);

當(dāng)a<b且b=c時(shí),f(a,b,c)= f(a,b-1,c-1)+f(a-2,b-2,c-2).

(由于f(a-2,b-1,c-1)產(chǎn)生了另一種情況:a<b且b=c,此時(shí)它由f(a,b-1,c-1)和f(a-2,b-2,c-2)兩種情總組成。f(a,b-1,c-1)表示該情況是由第二第三排豎放一個(gè)產(chǎn)生的;f(a-2,b-2,c-2)表示該情況是由3個(gè)橫放產(chǎn)生的,當(dāng)然第一排的橫放要比第二第三排縮一格。)

下一步就是要確定初始條件:

當(dāng)a=b=c=0時(shí),f(a,b,c)=1.因?yàn)橐涣幸膊慌乓菜闶且环N方法。

當(dāng)a或b或c中有一個(gè)小于0時(shí),f(a,b,c)=0.因?yàn)檫@種情況不可能存在。?

以下是我的代碼:

?

#include<stdio.h>

int f(int a,int b,int c)

{

??? if(a*b*c==0)return 1;

??? else if(a<0||b<0||c<0)return 0;

??? else if(a==b&&b==c)return 2*f(a-2,b-1,c-1)+f(a-2,b-2,c-2);

??? else if(a<b&&b==c)return f(a,b-1,c-1)+f(a-2,b-2,c-2);

}

int main()

{

??? int n,s;

??? while(scanf("%d",&n)!=EOF&&n!=-1)

??? {

????? if(n%2==0)s=f(n,n,n);

????? else s=0;

????? printf("%d\n",s);

??? }

??? return 0;

}?

PS:此題也可以根據(jù)遞推用數(shù)組解決,以減少題目用時(shí)。

?

?

?

?

?

?

1003:漢諾塔II

Problem Description

經(jīng)典的漢諾塔問(wèn)題經(jīng)常作為一個(gè)遞歸的經(jīng)典例題存在。可能有人并不知道漢諾塔問(wèn)題的典故。漢諾塔來(lái)源于印度傳說(shuō)的一個(gè)故事,上帝創(chuàng)造世界時(shí)作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動(dòng)一個(gè)圓盤。有預(yù)言說(shuō),這件事完成時(shí)宇宙會(huì)在一瞬間閃電式毀滅。也有人相信婆羅門至今仍在一刻不停地搬動(dòng)著圓盤。恩,當(dāng)然這個(gè)傳說(shuō)并不可信,如今漢諾塔更多的是作為一個(gè)玩具存在。Gardon就收到了一個(gè)漢諾塔玩具作為生日禮物。

  Gardon是個(gè)怕麻煩的人(恩,就是愛(ài)偷懶的人),很顯然將64個(gè)圓盤逐一搬動(dòng)直到所有的盤子都到達(dá)第三個(gè)柱子上很困難,所以Gardon決定作個(gè)小弊,他又找來(lái)了一根一模一樣的柱子,通過(guò)這個(gè)柱子來(lái)更快的把所有的盤子移到第三個(gè)柱子上。下面的問(wèn)題就是:當(dāng)Gardon在一次游戲中使用了N個(gè)盤子時(shí),他需要多少次移動(dòng)才能把他們都移到第三個(gè)柱子上?很顯然,在沒(méi)有第四個(gè)柱子時(shí),問(wèn)題的解是2^N-1,但現(xiàn)在有了這個(gè)柱子的幫助,又該是多少呢?

Input

包含多組數(shù)據(jù),每個(gè)數(shù)據(jù)一行,是盤子的數(shù)目N(1<=N<=64)。

Output

對(duì)于每組數(shù)據(jù),輸出一個(gè)數(shù),到達(dá)目標(biāo)需要的最少的移動(dòng)數(shù)。

Sample Input

1

3

12

Sample Output

1

5

81

Author

Gardon

Source

Gardon - DYGG's contest 2

?

題目分析:

?

我的思路:

剛開(kāi)始沒(méi)什么思路,于是分析數(shù)據(jù),發(fā)現(xiàn)了下面的規(guī)律:

a[1]=1;

a[2]=a[1]+2;a[3]=a[2]+2;(2個(gè)加2^1)

a[4]=a[3]+4;a[5]=a[4]+4;a[6]=a[5]+4;(3個(gè)加2^2);

…………………………………………(4個(gè)加2^3);

……

?

以下是我的代碼:

?

#include<stdio.h>

#include<math.h>

int main()

{

??? int n,i,j,k,sum;

??? int f;

??? while(scanf("%d",&n)!=EOF)

??? {

????? k=2;

????? for(i=1;i<=n;i++)

????? {

??????? if(i==1)f=1,sum=1;

??????? else

??????? {

????????? for(j=k;sum<i;j++)sum+=j;

????????? k=j;

????????? f+=(int)pow(2,j-2);

??????? }

????? }

????? printf("%d\n",f);

??? }

??? return 0;

}?

?

?

?

?

?

?

1004:三角形

Problem Description

用N個(gè)三角形最多可以把平面分成幾個(gè)區(qū)域?

Input

輸入數(shù)據(jù)的第一行是一個(gè)正整數(shù)T(1<=T<=10000),表示測(cè)試數(shù)據(jù)的數(shù)量.然后是T組測(cè)試數(shù)據(jù),每組測(cè)試數(shù)據(jù)只包含一個(gè)正整數(shù)N(1<=N<=10000).

Output

對(duì)于每組測(cè)試數(shù)據(jù),請(qǐng)輸出題目中要求的結(jié)果.

Sample Input

2

1

2

Sample Output

2

8

Author

Ignatius.L

?

題目分析:

?

我的思路:

第n個(gè)三角形每條邊最多與2*(n-1)條邊相交。對(duì)于每條邊,它所截出的區(qū)域(不算第n個(gè)三角形的角)有2*(n-1)-1個(gè),于是3條邊可截出6*(n-1)-3個(gè)區(qū)域,再加上3個(gè)角即可多出6*(n-1)個(gè)區(qū)域。

于是得遞推公式:f(n)=f(n-1)+ 6*(n-1)

初始條件是:f(1)=2

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

?????? int t,n;

?????? __int64 f;

?????? while(scanf("%d",&t)!=EOF)

?????? while(t--)

?????? {

????????????? scanf("%d",&n);

????????????? f=2;

????????????? while(n!=1)f+=6*(n-1),n--;

????????????? printf("%I64d\n",f);

?????? }

?????? return 0;

}?

PS:由以上遞推公式可得到最終公式,使得代碼更加優(yōu)化,這里就不再細(xì)說(shuō)了。

另外,平面是2維的,它跟二次多項(xiàng)式a*x^2+b*x+c有關(guān),我們可以用1、2、3個(gè)平面的情況推出系數(shù)a,b,c,這樣同樣可以得到最終公式!

?

?

?

?

?

?

1005:下沙的沙子有幾粒?

Problem Description

2005年11月份,我們學(xué)校參加了ACM/ICPC 亞洲賽區(qū)成都站的比賽,在這里,我們獲得了歷史性的突破,盡管只是一枚銅牌,但獲獎(jiǎng)那一刻的激動(dòng),也許將永遠(yuǎn)銘刻在我們幾個(gè)人的心頭。借此機(jī)會(huì),特向去年為參加ACM亞洲賽而艱苦集訓(xùn)了近半年的各位老隊(duì)員表示感謝。

實(shí)際上,除了獲獎(jiǎng)以外,在這次比賽期間還有一件事也讓我們記憶深刻。那是比賽當(dāng)天等待入場(chǎng)的時(shí)候,聽(tīng)到某個(gè)學(xué)校的一個(gè)隊(duì)員在說(shuō):“有個(gè)學(xué)校的英文名很有意思,叫什么Hangzhou Dianzi University”. 哈哈,看來(lái)我們學(xué)校的英文名起的非常好,非常吸引人呀。

不過(guò),事情的發(fā)展誰(shuí)也沒(méi)有料到,隨著杭電英文校名的這一次曝光,影響越來(lái)越大,很多人開(kāi)始對(duì)杭電英文校名進(jìn)行研究,不久以后甚至還成立了一個(gè)專門的研究機(jī)構(gòu),叫做“HDU 校名研究會(huì)”。并不斷有報(bào)道說(shuō)-相-當(dāng)-多的知名科學(xué)家改行,專門對(duì)該問(wèn)題進(jìn)行研究,學(xué)術(shù)界稱之為“杭電現(xiàn)象”。很多人在國(guó)際知名期刊上發(fā)表了研究論文,這其中,尤以中國(guó)超級(jí)女科學(xué)家宇春小姐寫的一篇研究報(bào)告最為著名,報(bào)告發(fā)表在science上,標(biāo)題是“杭電為什么這樣紅?” 文中研究發(fā)現(xiàn):Hangzhou Dianzi University這個(gè)校名具有深刻的哲學(xué)思想和內(nèi)涵,她同時(shí)提出了一個(gè)大膽的猜想:“假定一個(gè)字符串由m個(gè)H和n個(gè)D組成,從左到右掃描該串,如果字符H的累計(jì)數(shù)總是不小于字符D的累計(jì)數(shù),那么,滿足條件的字符串總數(shù)就恰好和下沙的沙粒一樣多。”

這就是當(dāng)今著名的“宇春猜想”!

雖然還沒(méi)能從數(shù)學(xué)上證明這個(gè)猜想的正確性,但據(jù)說(shuō)美國(guó)方面在小布什的親自干預(yù)下,已經(jīng)用超級(jí)計(jì)算機(jī)驗(yàn)證了在(1<=n<=m<=1000000000000)時(shí)都是正確的。my god! 這是一個(gè)多么偉大的猜想!雖然我們以前總說(shuō),21世紀(jì)是屬于中國(guó)的,可還是沒(méi)想這一天來(lái)的這么早,自豪ing... + 感動(dòng)ing...

感動(dòng)和自豪之余,問(wèn)題也來(lái)了,如果已知m和n的值,請(qǐng)計(jì)算下沙的沙粒到底有多少。

Ps:

1. 中國(guó)有關(guān)方面正在積極行動(dòng),著手為宇春小姐申報(bào)諾貝爾獎(jiǎng)。

2、“宇春猜想”中提到的H和D組成的字符串現(xiàn)在被學(xué)術(shù)界成為“杭電串串”(“杭電串串”前不久被一個(gè)賣羊肉串的注冊(cè)了商標(biāo),現(xiàn)在我校正在積極聯(lián)系買斷,據(jù)說(shuō)賣方的底價(jià)是1000萬(wàn)歐元,絕不打折,看來(lái)希望不大,sigh...)

Input

輸入數(shù)據(jù)包含多個(gè)測(cè)試實(shí)例,每個(gè)占一行,由兩個(gè)整數(shù)m和n組成,m和 n 分別表示字符串中H和D的個(gè)數(shù)。由于我們目前所使用的微機(jī)和老美的超級(jí)計(jì)算機(jī)沒(méi)法比,所以題目給定的數(shù)據(jù)范圍是(1<=n<=m<=20)。

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出下沙的沙粒到底有多少,計(jì)算規(guī)則請(qǐng)參考“宇春猜想”,每個(gè)實(shí)例的輸出占一行。

Sample Input

1 1

3 1

Sample Output

1

3

Author

lcy

Source

HDU 2006-4 Programming Contest

?

題目分析:

?

?

我的思路:

設(shè)由m個(gè)H和n個(gè)D組成的串有f(m,n)個(gè),它是由m+n-1個(gè)再加上一個(gè)H或D組成的。

于是得遞推公式:

f(m,n)=f(m-1,n)+f(m,n-1);

下一步確定初始條件:

f(0,1)=0; f(1,0)=1.

另外,當(dāng)m<n時(shí),f(m,n)=0; 當(dāng)m=0時(shí),f(m,n)=0; 當(dāng)n=0時(shí),f(m,n)=1.?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? int n,m,i,j;

??? __int64 f[22][22];

??? while(scanf("%d%d",&m,&n)!=EOF)

??? {

?????? for(i=0;i<=m;i++)

??????? for(j=0;j<=n;j++)

??????? {

????????? if((i==0)||(i<j))f[i][j]=0;

????????? else if(j==0)f[i][j]=1;

????????? else f[i][j]=f[i-1][j]+f[i][j-1];

??????? }

?????? printf("%I64d\n",f[m][n]);

??? }

??? return 0;

}?

PS:本題與1001類似,但不同的是,1001中拿50塊錢的人是不同的,所以交換位置也是一種排法;而本題中m個(gè)H是相同的,所以加進(jìn)的H無(wú)需與前m-1個(gè)H交換位置。另外,本題數(shù)據(jù)量比較小,因此更加簡(jiǎn)單!

?

?

?

?

?

?

1006:錢幣兌換問(wèn)題

Problem Description

在一個(gè)國(guó)家僅有1分,2分,3分硬幣,將錢N兌換成硬幣有很多種兌法。請(qǐng)你編程序計(jì)算出共有多少種兌法。

Input

每行只有一個(gè)正整數(shù)N,N小于32768。

Output

對(duì)應(yīng)每個(gè)輸入,輸出兌換方法數(shù)。

Sample Input

2934

12553

Sample Output

718831

13137761

Author

SmallBeer(CML)

Source

杭電ACM集訓(xùn)隊(duì)訓(xùn)練賽(VII)

?

?

題目分析:

?

我的思路:

假設(shè)數(shù)N/3得到的商為S,則可以分成S+1種大情況(即0~S個(gè)3)討論,對(duì)于每種大情況i (0<=i<=S),設(shè)(N-i*3)/2=W, 則又可以分為W+1種小情況(即0~W個(gè)2),而每個(gè)小情況中2的個(gè)數(shù)X則為X種兌法,因?yàn)?和2確定后,1也確定了,此時(shí)即為一種兌法。

?

我的代碼如下:

?

#include<stdio.h>

int main()

{

??? int i,j,n,tempi,tempj;

??? __int64 f;

??? while(scanf("%d",&n)!=EOF)

? ??{

????? tempi=n/3;

????? f=0;

????? for(i=0;i<=tempi;i++)f+=(n-i*3)/2+1;

????? printf("%I64d\n",f);

??? }

??? return 0;

}?

?

?

?

1007:獻(xiàn)給杭電五十周年校慶的禮物

Problem Description

或許你曾經(jīng)牢騷滿腹

或許你依然心懷憂傷

或許你近在咫尺

或許你我天各一方

對(duì)于每一個(gè)學(xué)子

母校

永遠(yuǎn)航行在

生命的海洋

今年是我們杭電建校五十周年,這是一個(gè)值得祝福的日子。我們?cè)撍徒o母校一個(gè)怎樣的禮物呢?對(duì)于目前的大家來(lái)說(shuō),最好的禮物當(dāng)然是省賽中的好成績(jī),我不能參賽,就送給學(xué)校一個(gè)DOOM III球形大蛋糕吧,這可是名牌,估計(jì)要花掉我半年的銀子呢。

想象著正式校慶那一天,校長(zhǎng)親自操刀,把這個(gè)大蛋糕分給各地趕來(lái)祝賀的校友們,大家一定很高興,呵呵,流口水了吧...

等一等,吃蛋糕之前先考大家一個(gè)問(wèn)題:如果校長(zhǎng)大人在蛋糕上切了N刀(校長(zhǎng)刀法極好,每一刀都是一個(gè)絕對(duì)的平面),最多可以把這個(gè)球形蛋糕切成幾塊呢?

做不出這個(gè)題目,沒(méi)有蛋糕吃的!

為-了-母-校-,為-了-蛋-糕-(不是為了DGMM,楓之羽最會(huì)浮想聯(lián)翩...),加-油-!

Input

輸入數(shù)據(jù)包含多個(gè)測(cè)試實(shí)例,每個(gè)實(shí)例占一行,每行包含一個(gè)整數(shù)n(1<=n<=1000),表示切的刀數(shù)。

Output

對(duì)于每組輸入數(shù)據(jù),請(qǐng)輸出對(duì)應(yīng)的蛋糕塊數(shù),每個(gè)測(cè)試實(shí)例輸出一行。

Sample Input

1

2

3

Sample Output

2

4

8

Author

lcy

Source

杭電ACM集訓(xùn)隊(duì)訓(xùn)練賽(VIII)

?

?

題目分析:

?

我的思路:

這其實(shí)是考我們n個(gè)平面最多可以把空間分成幾個(gè)部分的問(wèn)題。

使第n個(gè)平面與前面n-1個(gè)平面都相交,且交線都不重合,那么n-1條直線最多可以把平面劃分成為n(n-1)/2+1個(gè)部分

于是得遞推公式f(n)=f(n-1)+n(n-1)/2

初始條件:f(1)=2

?最后可以推出公式:f(n)=(n^3+5n+6)/6

?

我的代碼如下:

?

#include<stdio.h>

int main()

{

??? int n;

??? while(scanf("%d",&n)!=EOF)

????? printf("%d\n",(n*n*n+5*n+6)/6);

??? return 0;

}?

PS:空間是3維的,它跟三次多項(xiàng)式a*x^3+b*x^2+c*x+d有關(guān),我們可以由4種特殊情況(例如x=1、2、3、4)列四個(gè)方程,解出系數(shù)a,b,c,d,從而求出最終公式!

?

?

?

?

?

?

1008:Children’s Queue

Problem Description

There are many students in PHT School. One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single. In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is like

FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM

Here F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7. Can you make a program to find the total number of queue with n children?

Input

There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of children (1<=n<=1000)

Output

For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs.

Sample Input

1

2

3

Sample Output

1

2

4

Author

SmallBeer (CML)

Source

杭電ACM集訓(xùn)隊(duì)訓(xùn)練賽(VIII)

?

題目分析:

?

題目大意:

一個(gè)隊(duì)伍中有n個(gè)學(xué)生,但規(guī)定女生不能單獨(dú)站,也就是說(shuō),要么隊(duì)伍中沒(méi)有女生,要么有兩個(gè)或兩個(gè)以上的女生站在一起(這是保護(hù)弱勢(shì)力的體現(xiàn)!)。問(wèn)有多少這樣的隊(duì)伍。

?

我的思路:

設(shè)n個(gè)學(xué)生生按規(guī)則排成的隊(duì)列有f(n)種,那么當(dāng)總?cè)藬?shù)少一個(gè)時(shí)會(huì)是什么情況呢?顯然,要么少一個(gè)男的,要么少一個(gè)女的。故有如下情況:

(1)??? 少一個(gè)男的,也就是說(shuō),第n個(gè)加進(jìn)去的是男生。此時(shí),隊(duì)列n-1只需按規(guī)則站好即可,故有f(n-1)種方法。

(2)??? 少一個(gè)女的,也就是說(shuō),第n個(gè)加進(jìn)去的是女生。此時(shí),前面的肯定不能是男生,因?yàn)楹竺婕舆M(jìn)去的女生只有一個(gè),不符合規(guī)則,因此第n-1個(gè)(也就是前1個(gè))必須是女生。若n-2個(gè)是按規(guī)則站好的,則有f(n-2)種方法;若n-2個(gè)不是按規(guī)則站好的(因?yàn)榈趎-1,第n個(gè)是女生,所以第n-2個(gè)可以是女生,第n-3個(gè)可以是男生。當(dāng)沒(méi)加進(jìn)第n-1和第n個(gè)女生的時(shí)候,這是不合規(guī)則的),即第n-2個(gè)是女生,第n-3個(gè)是男生,此后第n-4個(gè)必須按規(guī)則站好,故有f(n-4)種方法。

于是得遞推公式:

f(n)=f(n-1)+f(n-2)+f(n-4);

下一步就要確定初始條件:

由于遞推公式有f(n-1)、f(n-2)和f(n-4),故必須給出f(1)、f(2) 、f(3)和 f(4)

由題意得:f(1)=1;f(2) =2;f(3)=4; f(4)=7。

?

注意:由于本題數(shù)據(jù)量比較大,必須要用高精度,同時(shí)用數(shù)組保存結(jié)果來(lái)代替遞歸。

下面是我的代碼:

?

#include<stdio.h>

#define c 31

#define d 100000000

int main()

{

??? int n,i,j;

??? int f[1000][c]={0};

??? f[0][0]=1;

??? f[1][0]=2;

??? f[2][0]=4;

??? f[3][0]=7;

??? for(i=4;i<1000;i++)

??? {

????? for(j=0;j<c;j++)

??????? f[i][j]=f[i-1][j]+f[i-2][j]+f[i-4][j];

????? for(j=0;j<c-1;j++)

??????? if(f[i][j]>d)

??????? {

????????? f[i][j+1]+=f[i][j]/d;

????????? f[i][j]%=d;

?????? ?}

??? }

??? while(scanf("%d",&n)!=EOF)

??? {

????? for(i=c-1;i>0;i--)if(f[n-1][i]!=0)break;

????? printf("%d",f[n-1][i]);

????? for(j=i-1;j>=0;j--)printf("%08d",f[n-1][j]);

????? printf("\n");

??? }

??? return 0;

}?

?

?

?

?

?

?

1009:Counting Triangles

Problem Description

Given an equilateral triangle with n the length of its side, program to count how many triangles in it.

?

Input

The length n (n <= 500) of the equilateral triangle's side, one per line.

process to the end of the file

Output

The number of triangles in the equilateral triangle, one per line.

Sample Input

1

2

3

Sample Output

1

5

13

Author

JIANG, Jiefeng

Source

ZOJ Monthly, June 2003

?

?

題目分析:

?

題目大意:

邊長(zhǎng)為n的等邊三角形由若干個(gè)邊長(zhǎng)為1的等邊三角形組成,問(wèn)它里面包含多少個(gè)等邊三角形(邊長(zhǎng)從1到n,且有正立和倒立兩種情況)。

?

我的思路:

先分析幾個(gè)邊長(zhǎng)小的等邊三角形的情況,借此得出遞推公式。

由于邊長(zhǎng)>1的倒三角形比較難算,故分開(kāi)討論

邊長(zhǎng)???????????? ?????? 正三角形??????????? ?????? 邊長(zhǎng)為1的倒三角????????? 邊長(zhǎng)>1的倒三角形

1?????????????????? ?????? h(1)=1??????????????????????? g(1)=0????????????????????????????????????? 0

2?????????????????? ?????? h(2)=h(1)+3??????????????? g(2)=g(1)+1????????????????????????????? 0

3?????????????????? ?????? h(3)=h(2)+6??????????????? g(3)=g(2)+2????????????????????????????? 0

……

n?????????????????? h(n)=h(n-1)+ n*(n+1)/2???? g(n)=g(n-1)+n-1?????????????????????? ?

?

現(xiàn)在討論邊長(zhǎng)>1的倒三角形數(shù):

顯然當(dāng)邊長(zhǎng)>=4時(shí)才有邊長(zhǎng)>1的倒三角形。

邊長(zhǎng)????? 底邊等分點(diǎn)數(shù)????????????????? 邊長(zhǎng)為i(i>1)的倒三角形數(shù)量

4??????????? 4-1???????????????????????????????????? u(4)=(4-1)-2*(2-1)

5??????????? 5-1???????????????????????????????????? u(5)=u(4)+ (5-1)-2*(2-1)+ (5-1)-2*(3-1)

6??????????? 6-1???????????????????????????????????? u(6)=u(5)+ [(6-1)-2*(2-1)]+ [(6-1)-2*(3-1)]

……

n??????????? n-1???????? u(n)=u(n-1)+[(n-1)-2*(2-1)]+[(n-1)-2*(3-1)]+…+[(n-1)-2*(i-1)]+…

?

于是得遞推關(guān)系:

當(dāng)n<4時(shí),f(n)=f(n-1)+n*(n+1)/2+(n-1);

當(dāng)n>=4時(shí),f(n)=f(n-1)+n*(n+1)/2+(n-1)+u(n);

初始條件為: f(1)=1;

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

?????? int n,i,j;

?????? __int64 f;

?????? while(scanf("%d",&n)!=EOF)

?????? {

?????? ? for(i=1;i<=n;i++)

????????????? if(i==1)f=1;

????????????? else

????????????? {

????????????? ? f+=i*(i+1)/2+(i-1);??????? //加上正立三角形數(shù)和邊長(zhǎng)為1的倒三角形數(shù)

????????????? ? if(i>=4)

????????????? ??? for(j=3;i-j>=1;j+=2)f+=i-j;????? //當(dāng)n>=4時(shí),加上邊長(zhǎng)>1的倒三角形數(shù)

????????????? ? }

?????? ? printf("%I64d\n",f);

?????? }

?????? return 0;

}?

?

?

?

?

?

1010:Tiling a Grid With Dominoes

Problem Description

We wish to tile a grid 4 units high and N units long with rectangles (dominoes) 2 units by one unit (in either orientation). For example, the figure shows the five different ways that a grid 4 units high and 2 units wide may be tiled.

Write a program that takes as input the width, W, of the grid and outputs the number of different ways to tile a 4-by-W grid.

Input

The first line of input contains a single integer N, (1 ≤ N ≤ 1000) which is the number of datasets that follow.

Each dataset contains a single decimal integer, the width, W, of the grid for this problem instance.

Output

For each problem instance, there is one line of output: The problem instance number as a decimal integer (start counting at one), a single space and the number of tilings of a 4-by-W grid. The values of W will be chosen so the count will fit in a 32-bit integer.

Sample Input

3

2

3

7

Sample Output

1 5

2 11

3 781

Source

2008 "Shun Yu Cup" Zhejiang Collegiate Programming Contest - Warm Up(1)

?

?

題目分析:

?

題目大意:

用1×2的多米諾骨牌,拼成4×w的矩形,總共有多少種方法?

?

我的思路:

此題與1002類似,但此題比1002復(fù)雜得多,用遞歸己經(jīng)不能解決問(wèn)題了,但可以借鑒它的思想,再轉(zhuǎn)用數(shù)組存儲(chǔ)即可。先說(shuō)一下它的思想:

設(shè)f(a,b,c,d)表示第一行覆蓋a格,第二行覆蓋b格,第三行覆蓋c格,第四行覆蓋d格時(shí)的方法數(shù),當(dāng)拼成4*w的矩形時(shí),有f(w,w,w,w)種方法。那么在此之前,它有哪些狀態(tài)呢?由于骨排要么是橫放要么是豎放,所以在取走第w列時(shí),有下面幾種情況:(a=b=c=d=w)

(1)f(a-1,b-1,c-2,d-2);//第一行第二行是豎放的,另外兩行是橫放的,其他情況類似

(2)f(a-2,b-2,c-1,d-1);

(3)f(a-2,b-1,c-1,d-2);

(4)f(a-2,b-2,c-2,d-2);

(5)f(a-1,b-1,c-1,d-1);

現(xiàn)在又要考慮上面的情況又是怎么得來(lái)的:

對(duì)于(1),它是由f(a-2,b-2,c,d)和f(a-1,b-1,c,d)得來(lái)的;

對(duì)于(2),它是由f(a,b,c-1,d-1)和f(a,b,c-2,d-2)得來(lái)的;

對(duì)于(3),它是由f(a,b-2,c-2,d)和f(a,b-1,c-1,d)得來(lái)的;

對(duì)于(4)和(5),它跟a=b=c=d的情況一樣;

另外,還有一種情況:當(dāng)a=d且b=c且a>b時(shí),它是由f(a-2,b,c,d-2)得來(lái)的。

下一步就要確定初始條件:

當(dāng)a=b=c=d<0時(shí),f(a,b,c,d)=0;

當(dāng)a=b=c=d=0或者1時(shí),f(a,b,c,d)=1;

當(dāng)a=b=0且c=d=1或者a=b=1且c=d=0時(shí),f(a,b,c,d)=1;

當(dāng)a=d=0且b=c=1時(shí),f(a,b,c,d)=1;

當(dāng)a=d=1且b=c=1時(shí),f(a,b,c,d)=0;

剛才已經(jīng)說(shuō)過(guò),用遞歸會(huì)超時(shí),所以要轉(zhuǎn)成數(shù)組來(lái)存儲(chǔ),下面是數(shù)組的轉(zhuǎn)化:

以1表示己經(jīng)覆蓋,0表示未覆蓋,故每列均可由一個(gè)二進(jìn)制數(shù)表示,情況如下:

f[t][0]:0000

f[t][1]:0011

f[t][2]:0110

f[t][3]:1001

f[t][4]:1100

f[t][5]:1111

初始條件和狀態(tài)轉(zhuǎn)換均可參考上面的思想。

?

?

以下是我的代碼:

?

#include<stdio.h>

#define c 25

int main()

{

??? int n,w,t;

??? int f[c+1][7];

??? f[1][0]=f[1][1]=f[1][2]=f[1][4]=f[1][5]=1;

??? f[1][3]=0;

??? for(t=2;t<=c;t++)

??? {

???? f[t][0]=f[t-1][5];

???? f[t][1]=f[t-1][5]+f[t-1][4];

???? f[t][2]=f[t-1][5]+f[t-1][3];

???? f[t][3]=f[t-1][2];

???? f[t][4]=f[t-1][5]+f[t-1][1];

???? f[t][5]=f[t-1][0]+f[t-1][1]+f[t-1][2]+f[t-1][4]+f[t-1][5];????

? ???}

??? while(scanf("%d",&n)!=EOF)

??? {

????? int i=1;

????? while(n--)

????? {

??????? scanf("%d",&w);

??????? printf("%d %d\n",i++,f[w][5]);

????? }

??? }

??? return 0;

}?

?

?

?

由于時(shí)間有限,只分析以上10道題,以下10道題粘代碼

?

1011:漢諾塔V

Problem Description

用1,2,...,n表示n個(gè)盤子,稱為1號(hào)盤,2號(hào)盤,...。號(hào)數(shù)大盤子就大。經(jīng)典的漢諾塔問(wèn)

題經(jīng)常作為一個(gè)遞歸的經(jīng)典例題存在。可能有人并不知道漢諾塔問(wèn)題的典故。漢諾塔來(lái)源于

印度傳說(shuō)的一個(gè)故事,上帝創(chuàng)造世界時(shí)作了三根金剛石柱子,在一根柱子上從下往上按大小

順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開(kāi)始按大小順序重新擺放在另一根柱

子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動(dòng)一個(gè)圓盤。我們

知道最少需要移動(dòng)2^64-1次.在移動(dòng)過(guò)程中發(fā)現(xiàn),有的圓盤移動(dòng)次數(shù)多,有的少 。 告之盤

子總數(shù)和盤號(hào),計(jì)算該盤子的移動(dòng)次數(shù).

Input

包含多組數(shù)據(jù),首先輸入T,表示有T組數(shù)據(jù).每個(gè)數(shù)據(jù)一行,是盤子的數(shù)目N(1<=N<=60)和盤

號(hào)k(1<=k<=N)。

Output

對(duì)于每組數(shù)據(jù),輸出一個(gè)數(shù),到達(dá)目標(biāo)時(shí)k號(hào)盤需要的最少移動(dòng)數(shù)。

Sample Input

2

60 1

3 1

Sample Output

576460752303423488

4

?

Author

Zhousc@ECJTU

Source

ECJTU 2008 Spring Contest

?

我的代碼如下:

?

#include<stdio.h>

#include<math.h>

int main()

{

??? int t,n,k;

??? __int64 f;

??? while(scanf("%d",&t)!=EOF)

??? while(t--)

??? {

?????? scanf("%d%d",&n,&k);

?????? f=(__int64)pow(2,n-k);

?????? printf("%I64d\n",f);

??? }

??? return 0;

}?

?

1012:漢諾塔VI

Problem Description

n個(gè)盤子的漢諾塔問(wèn)題的最少移動(dòng)次數(shù)是2^n-1,即在移動(dòng)過(guò)程中會(huì)產(chǎn)生2^n個(gè)系列。由于

發(fā)生錯(cuò)移產(chǎn)生的系列就增加了,這種錯(cuò)誤是放錯(cuò)了柱子,并不會(huì)把大盤放到小盤上,即各柱

子從下往上的大小仍保持如下關(guān)系 :

n=m+p+q

a1>a2>...>am

b1>b2>...>bp

c1>c2>...>cq

計(jì)算所有會(huì)產(chǎn)生的系列總數(shù).

Input

包含多組數(shù)據(jù),首先輸入T,表示有T組數(shù)據(jù).每個(gè)數(shù)據(jù)一行,是盤子的數(shù)

目N<30.

Output

對(duì)于每組數(shù)據(jù),輸出移動(dòng)過(guò)程中所有會(huì)產(chǎn)生的系列總數(shù)。

Sample Input

3

1

3

29

Sample Output

3

27

68630377364883

Author

Zhousc@ECJTU

Source

ECJTU 2008 Spring Contest

?

?

以下是我的代碼:

?

#include<stdio.h>

#include<math.h>

int main()

{

??? double f;

??? int t,n;

??? while(scanf("%d",&t)!=EOF)

??? while(t--)

??? {

????? scanf("%d",&n);

????? f=pow(3,n);

????? printf("%.0lf\n",f);

??? }

??? return 0;

}?

?

1013:蟠桃記

Problem Description

喜歡西游記的同學(xué)肯定都知道悟空偷吃蟠桃的故事,你們一定都覺(jué)得這猴子太鬧騰了,其實(shí)你們是有所不知:悟空是在研究一個(gè)數(shù)學(xué)問(wèn)題!

什么問(wèn)題?他研究的問(wèn)題是蟠桃一共有多少個(gè)!

不過(guò),到最后,他還是沒(méi)能解決這個(gè)難題,呵呵^-^

當(dāng)時(shí)的情況是這樣的:

第一天悟空吃掉桃子總數(shù)一半多一個(gè),第二天又將剩下的桃子吃掉一半多一個(gè),以后每天吃掉前一天剩下的一半多一個(gè),到第n天準(zhǔn)備吃的時(shí)候只剩下一個(gè)桃子。聰明的你,請(qǐng)幫悟空算一下,他第一天開(kāi)始吃的時(shí)候桃子一共有多少個(gè)呢?

Input

輸入數(shù)據(jù)有多組,每組占一行,包含一個(gè)正整數(shù)n(1<30>

Output

對(duì)于每組輸入數(shù)據(jù),輸出第一天開(kāi)始吃的時(shí)候桃子的總數(shù),每個(gè)測(cè)試實(shí)例占一行。

Sample Input

2

4

Sample Output

4

22

Author

lcy

Source

C語(yǔ)言程序設(shè)計(jì)練習(xí)(二)

?

?

#include<stdio.h>

int main()

{

?????? int f,n;

?????? while(scanf("%d",&n)!=EOF)

?????? {

????????????? f=1;

????????????? while(n!=1)f=2*(f+1),n--;

????????????? printf("%d\n",f);

?????? }

?????? return 0;

}?

?

1014:超級(jí)樓梯

Problem Description

有一樓梯共M級(jí),剛開(kāi)始時(shí)你在第一級(jí),若每次只能跨上一級(jí)或二級(jí),要走上第M級(jí),共有多少種走法?

Input

輸入數(shù)據(jù)首先包含一個(gè)整數(shù)N,表示測(cè)試實(shí)例的個(gè)數(shù),然后是N行數(shù)據(jù),每行包含一個(gè)整數(shù)M(1<=M<=40),表示樓梯的級(jí)數(shù)。

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出不同走法的數(shù)量

Sample Input

2

2

3

Sample Output

1

2

Author

lcy

Source

2005實(shí)驗(yàn)班短學(xué)期考試

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

?????? int s[41],n,m,i;

?????? while(scanf("%d",&n)!=EOF)

?????? while(n--)

?????? {

????????????? scanf("%d",&m);

????????????? for(i=0;i<m;i++)

????????????? {

????????????? ?if((i==0)||(i==1))s[i]=1;

?????? ????? else if(i>1)s[i]=s[i-1]+s[i-2];

????????????? }

????????????? printf("%d\n",s[m-1]);

?????? }

?????? return 0;

}?

?

?

1015:一只小蜜蜂...

Problem Description

有一只經(jīng)過(guò)訓(xùn)練的蜜蜂只能爬向右側(cè)相鄰的蜂房,不能反向爬行。請(qǐng)編程計(jì)算蜜蜂從蜂房a爬到蜂房b的可能路線數(shù)。

其中,蜂房的結(jié)構(gòu)如下所示。

Input

輸入數(shù)據(jù)的第一行是一個(gè)整數(shù)N,表示測(cè)試實(shí)例的個(gè)數(shù),然后是N 行數(shù)據(jù),每行包含兩個(gè)整數(shù)a和b(0<50>

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出蜜蜂從蜂房a爬到蜂房b的可能路線數(shù),每個(gè)實(shí)例的輸出占一行。

Sample Input

2

1 2

3 6

Sample Output

1

3

Author

lcy

Source

遞推求解專題練習(xí)(For Beginner)

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

?????? int s[41],n,m,i;

?????? while(scanf("%d",&n)!=EOF)

?????? while(n--)

?????? {

????????????? scanf("%d",&m);

????????????? for(i=0;i<m;i++)

????????????? {

????????????? ?if((i==0)||(i==1))s[i]=1;

?????? ????? else if(i>1)s[i]=s[i-1]+s[i-2];

????????????? }

????????????? printf("%d\n",s[m-1]);

?????? }

?????? return 0;

}?

?

?

?

1016:不容易系列之(3)—— LELE的RPG難題

Problem Description

人稱“AC女之殺手”的超級(jí)偶像LELE最近忽然玩起了深沉,這可急壞了眾多“Cole”(LELE的粉絲,即"可樂(lè)"),經(jīng)過(guò)多方打探,某資深Cole終于知道了原因,原來(lái),LELE最近研究起了著名的RPG難題:

有排成一行的n個(gè)方格,用紅(Red)、粉(Pink)、綠(Green)三色涂每個(gè)格子,每格涂一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的涂法.

以上就是著名的RPG難題.

如果你是Cole,我想你一定會(huì)想盡辦法幫助LELE解決這個(gè)問(wèn)題的;如果不是,看在眾多漂亮的痛不欲生的Cole女的面子上,你也不會(huì)袖手旁觀吧?

Input

輸入數(shù)據(jù)包含多個(gè)測(cè)試實(shí)例,每個(gè)測(cè)試實(shí)例占一行,由一個(gè)整數(shù)N組成,(0<=50)。< P>

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出全部的滿足要求的涂法,每個(gè)實(shí)例的輸出占一行。

Sample Input

1

2

Sample Output

3

6

Author

lcy

Source

遞推求解專題練習(xí)(For Beginner)

?

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? int n,i;

??? __int64 f[51];

?? ?while(scanf("%d",&n)!=EOF)

??? {

????? for(i=0;i<n;i++)

??????? if(i==0)f[i]=3;

??????? else if((i==1)||(i==2))f[i]=6;

??????? else f[i]=f[i-1]+2*f[i-2];

????? printf("%I64d\n",f[n-1]);

??? }

??? return 0;

}?

?

?

?

1017:阿牛的EOF牛肉串

Problem Description

今年的ACM暑期集訓(xùn)隊(duì)一共有18人,分為6支隊(duì)伍。其中有一個(gè)叫做EOF的隊(duì)伍,由04級(jí)的阿牛、XC以及05級(jí)的COY組成。在共同的集訓(xùn)生活中,大家建立了深厚的友誼,阿牛準(zhǔn)備做點(diǎn)什么來(lái)紀(jì)念這段激情燃燒的歲月,想了一想,阿牛從家里拿來(lái)了一塊上等的牛肉干,準(zhǔn)備在上面刻下一個(gè)長(zhǎng)度為n的只由"E" "O" "F"三種字符組成的字符串(可以只有其中一種或兩種字符,但絕對(duì)不能有其他字符),阿牛同時(shí)禁止在串中出現(xiàn)O相鄰的情況,他認(rèn)為,"OO"看起來(lái)就像發(fā)怒的眼睛,效果不好。

你,NEW ACMer,EOF的崇拜者,能幫阿牛算一下一共有多少種滿足要求的不同的字符串嗎?

PS: 阿牛還有一個(gè)小秘密,就是準(zhǔn)備把這個(gè)刻有 EOF的牛肉干,作為神秘禮物獻(xiàn)給杭電五十周年校慶,可以想象,當(dāng)校長(zhǎng)接過(guò)這塊牛肉干的時(shí)候該有多高興!這里,請(qǐng)?jiān)试S我代表杭電的ACMer向阿牛表示感謝!

再次感謝!

Input

輸入數(shù)據(jù)包含多個(gè)測(cè)試實(shí)例,每個(gè)測(cè)試實(shí)例占一行,由一個(gè)整數(shù)n組成,(0<40>

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出全部的滿足要求的涂法,每個(gè)實(shí)例的輸出占一行。

Sample Input

1

2

Sample Output

3

8

Author

lcy

Source

遞推求解專題練習(xí)(For Beginner)

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? int n,i;

??? __int64 f[41];

??? while(scanf("%d",&n)!=EOF)

??? {

????? for(i=0;i<n;i++)

?????? if(i==0)f[i]=3;

?????? else if(i==1)f[i]=8;

?????? else f[i]=2*(f[i-1]+f[i-2]);

????? printf("%I64d\n",f[n-1]);

??? }

??? return 0;

}?

?

?

?

1018:折線分割平面

Problem Description

我們看到過(guò)很多直線分割平面的題目,今天的這個(gè)題目稍微有些變化,我們要求的是n條折線分割平面的最大數(shù)目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。

Input

輸入數(shù)據(jù)的第一行是一個(gè)整數(shù)C,表示測(cè)試實(shí)例的個(gè)數(shù),然后是C 行數(shù)據(jù),每行包含一個(gè)整數(shù)n(0<=10000),表示折線的數(shù)量。< P>

Output

對(duì)于每個(gè)測(cè)試實(shí)例,請(qǐng)輸出平面的最大分割數(shù),每個(gè)實(shí)例的輸出占一行。

Sample Input

2

1

2

Sample Output

2

7

Author

lcy

Source

遞推求解專題練習(xí)(For Beginner)

?

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? int c,n,i;

??? __int64 f;

??? while(scanf("%d",&c)!=EOF)

??? while(c--)

??? {

????? scanf("%d",&n);

????? for(i=1;i<=n;i++)

??????? if(i==1)f=2;

??????? else f+=4*i-3;

????? printf("%I64d\n",f);

??? }

??? return 0;

}?

?

?

1019:漢諾塔III

Problem Description

約19世紀(jì)末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由64個(gè)圓盤構(gòu)成的塔。目的是將最左邊桿上的盤全部移到右邊的桿上,條件是一次只能移動(dòng)一個(gè)盤,且不允許大盤放在小盤的上面。

現(xiàn)在我們改變游戲的玩法,不允許直接從最左(右)邊移到最右(左)邊(每次移動(dòng)一定是移到中間桿或從中間移出),也不允許大盤放到下盤的上面。

Daisy已經(jīng)做過(guò)原來(lái)的漢諾塔問(wèn)題和漢諾塔II,但碰到這個(gè)問(wèn)題時(shí),她想了很久都不能解決,現(xiàn)在請(qǐng)你幫助她。現(xiàn)在有N個(gè)圓盤,她至少多少次移動(dòng)才能把這些圓盤從最左邊移到最右邊?

Input

包含多組數(shù)據(jù),每次輸入一個(gè)N值(1<=N=35)。

Output

對(duì)于每組數(shù)據(jù),輸出移動(dòng)最小的次數(shù)。

Sample Input

1

3

12

Sample Output

2

26

531440

Author

Rabbit

Source

RPG專場(chǎng)練習(xí)賽

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? __int64 f[36];

??? int n,i;

??? while(scanf("%d",&n)!=EOF)

??? {

??????? if(n==1)f[n]=2;

??????? else for(i=2;i<=n;i++)f[i]=3*f[i-1]+2;

??????? printf("%I64d\n",f[n]);

??? }

??? return 0;

}?

?

?

1020:跳舞毯

Problem Description

由于長(zhǎng)期缺乏運(yùn)動(dòng),小黑發(fā)現(xiàn)自己的身材臃腫了許多,于是他想健身,更準(zhǔn)確地說(shuō)是減肥。

小黑買來(lái)一塊圓形的毯子,把它們分成三等分,分別標(biāo)上A,B,C,稱之為“跳舞毯”,他的運(yùn)動(dòng)方式是每次都從A開(kāi)始跳,每次都可以任意跳到其他塊,但最后必須跳回A,且不能原地跳.為達(dá)到減肥效果,小黑每天都會(huì)堅(jiān)持跳n次,有天他突然想知道當(dāng)他跳n次時(shí)共幾種跳法,結(jié)果想了好幾天沒(méi)想出來(lái)-_-

現(xiàn)在就請(qǐng)你幫幫他,算出總共有多少跳法。

Input

測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例占一行,表示n的值(1<=n<=1000)。

當(dāng)n為0時(shí)輸入結(jié)束。

Output

每個(gè)測(cè)試用例的輸出占一行,由于跳法非常多,輸出其對(duì)10000取模的結(jié)果.

Sample Input

2

3

4

0

Sample Output

2

2

6

Author

蔥頭

Source

2008信息工程學(xué)院集訓(xùn)隊(duì)——選拔賽

?

?

以下是我的代碼:

?

#include<stdio.h>

int main()

{

??? int n,i;

??? __int64 f[1001];

??? __int64 g[1001];

??? while(scanf("%d",&n)!=EOF&&n!=0)

??? {

????? for(i=0;i<n;i++)

?????? if(i==0)f[i]=0,g[i]=1;

?????? else if(i==1)f[i]=2,g[i]=1;

?????? else

?????? {

???????? f[i]=2*g[i-1]%10000;

???????? g[i]=(f[i-1]+g[i-1])%10000;

???????? }

????? printf("%I64d\n",f[n-1]);

??? }

??? return 0;

}?

總結(jié)

以上是生活随笔為你收集整理的ACM训练赛--递推专题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。