WormTime Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3400 Accepted Submission(s): 2191
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
Sample Output
|
思路:设dp[i][j]为第i分钟到达第j棵树的方案数,状态转移方程dp[i][j] += dp[i-1][j+1] + dp[i-1][j-1]。
直接O(n*n)暴力转移就好了。
AC代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define MAXN (100+10)
#define MAXM (50000000)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 100000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
using namespace std;
int dp[MAXN][MAXN];
int main()
{
int N, P, M, T;
while(scanf("%d%d%d%d", &N, &P, &M, &T) != EOF)
{
CLR(dp, 0);
dp[0][P] = 1;
for(int i = 1; i <= M; i++)
{
for(int j = 1; j <= N; j++)
{
if(j == 1)
dp[i][j] += dp[i-1][j+1];
else if(j == N)
dp[i][j] += dp[i-1][j-1];
else
dp[i][j] += dp[i-1][j-1] + dp[i-1][j+1];
}
}
printf("%d\n", dp[M][T]);
}
return 0;
}