Worm

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2725    Accepted Submission(s): 1760


Problem Description
自从见识了平安夜苹果的涨价后,Lele就在他家门口水平种了一排苹果树,共有N棵。

突然Lele发现在左起第P棵树上(从1开始计数)有一条毛毛虫。为了看到毛毛虫变蝴蝶的过程,Lele在苹果树旁观察了很久。虽然没有看到蝴蝶,但Lele发现了一个规律:每过1分钟,毛毛虫会随机从一棵树爬到相邻的一棵树上。

比如刚开始毛毛虫在第2棵树上,过1分钟后,毛毛虫可能会在第1棵树上或者第3棵树上。如果刚开始时毛毛虫在第1棵树上,过1分钟以后,毛毛虫一定会在第2棵树上。

现在告诉你苹果树的数目N,以及毛毛刚开始所在的位置P,请问,在M分钟后,毛毛虫到达第T棵树,一共有多少种行走方案数。
 

 

Input
本题目包含多组测试,请处理到文件结束(EOF)。
每组测试占一行,包括四个正整数N,P,M,T(含义见题目描述,0<N,P,M,T<100)
 

 

Output
对于每组数据,在一行里输出一共的方案数。
题目数据保证答案小于10^9
 

 

Sample Input
3 2 4 2
3 2 3 2
 
Sample Output
4 0
Hint
第一组测试中有以下四种走法:
2->1->2->1->2
2->1->2->3->2
2->3->2->1->2
2->3->2->3->2
 
思路:DP题,dp[M][T]表示走M分钟时到点T的方法数。 状态转移方程: dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 #include<string.h>
 5 #include<cstring>
 6 #include<string>
 7 #include<iostream>
 8 #include<stack>
 9 #include<queue>
10 #include<set>
11 #include<map>
12 #include<cmath>
13 #include<vector>
14 #include<limits.h>
15 #include<algorithm>
16 #define LL long long
17 #define mod 1e9 + 7
18 
19 using namespace std;
20 
21 const int M = 105;
22 
23 int dp[M][M];
24 
25 int main()
26 {
27     int n, p, m, t;
28     while( cin >> n >> p >> m >> t )
29     {
30         memset(dp,0,sizeof(dp));
31         dp[0][p] = 1;
32         for(int i = 1; i <= m; ++i)
33         {
34             for(int j = 1; j <= n; ++j)
35             {
36                 if(j + 1 <= n)
37                     dp[i][j] += dp[i - 1][j + 1];
38                 if(j > 1)
39                     dp[i][j] += dp[i - 1][j - 1];
40             }
41         }
42         cout << dp[m][t] << endl;
43     }
44     return 0;
45 }
View Code

 

posted on 2014-09-12 17:20  Unico  阅读(146)  评论(0)    收藏  举报