题意略。
思路:设dp[i][j]为当前位置为i,剩余时间为j到达终点的方案数。
dp[T][0] = 0;
dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1]。
我的代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 105;
int n,p,m,t;
int dp[maxn][maxn];
int dfs(int cur,int time){
if(dp[cur][time] != -1) return dp[cur][time];
if(time == 0){
if(cur == t) return dp[cur][time] = 1;
else return dp[cur][time] = 0;
}
int res = 0;
if(cur != 1) res += dfs(cur-1,time-1);
if(cur != n) res += dfs(cur+1,time-1);
return dp[cur][time] = res;
}
int main(){
while(~scanf("%d%d%d%d",&n,&p,&m,&t)){
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(p,m));
}
return 0;
}