HDU 2512 第二類Strling數

一卡通大冒險

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1864    Accepted Submission(s): 1238


Problem Description
因爲長期鑽研算法, 無暇顧及個人問題,BUAA ACM/ICPC 訓練小組的帥哥們大部分都是單身。某天,他們在機房商量一個絕妙的計劃"一卡通大冒險"。這個計劃是由wf最先提出來的,計劃的內容是,把自己的聯繫方式寫在校園一卡通的背面,然後故意將自己的卡"遺失"在某處(如水房,TD,食堂,主M。。。。)他們希望能有MM看到他們遺失卡,能主動跟他們聯繫,這樣就有機會請MM吃飯了。他們決定將自己的一卡通夾在基本相同的書裏,然後再將書遺失到校園的各個角落。正當大家爲這個絕妙的計劃叫好時,大家想到一個問題。很明顯,如果只有一張一卡通,那麼只有一種方法,即,將其夾入一本書中。當有兩張一卡通時,就有了兩種選擇,即,將兩張一卡通夾在一本書裏,或者分開夾在不同的書裏。當有三張一卡通時,他們就有了5種選擇,即:
{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}} 於是,
這個邪惡計劃的組織者wf希望瞭解,如果ACM訓練對裏有n位帥哥(即有N張一卡通),那麼要把這些一卡通夾到書裏有多少種不同的方法。
 

Input
包含多組數據,第一行爲n,表示接下來有n組數據。以下每行一個數x,表示共有x張一卡通。(1≤x≤2000).
 

Output
對每組數據,輸出一行:不同的方法數,因爲這個數可能非常大,我們只需要它除以1000的餘數。
 

Sample Input
4 1 2 3 100
 

Sample Output
1 2 5 751
 
S(n,k)=S(n-1,k-1)+k*S(n-1,k),S(1,1)=1,S(n,n)=1。


#include<iostream>
#include<cstring>
using namespace std;
short int dp[2001][2001]={0};
int dfs(int x,int y);
int main()
{
int n=0;
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=2000;i++)
{
dp[i][0]=dp[0][i]=0;
dp[i][i]=1;
    }
cin>>n;
while(n--)
{
int x=0;
cin>>x;
long long sum=0;
for(int i=1;i<=x;i++)
sum=(sum+dfs(x,i))%1000;
cout<<sum<<endl;
}
return 0;
}
int dfs(int x,int y)
{
if(dp[x][y]!=-1) return dp[x][y];
return dp[x][y]=(dfs(x-1,y-1)+y*dfs(x-1,y))%1000;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章