在梦境中,你踏上了一只木䇝,在江上漂流根据对当地的了解,你知道在你下游 D 米处有一个峡谷,如果你向下游前进大于等于 D 米则必死无疑。现在你打响了急救电话,T 秒后救援队会到达并将你救上岸。水流速度是 1 m/s,你现在有 M 点体力。每消耗一点体力,你可以划一秒桨使船向上游前 进 1m,否则会向下游前进 1 m (水流)。你有M 点体力需在救援队赶来前花光。因为江面太宽了,凭借你自己的力量不可能上岸。
请问,有多少种划桨的方案可以让你得救。
两个划桨方案不同是指:存在某一秒钟,一个方案划桨,另一个方案不划。
输入格式
输入一行包含三个整数
�
D,
�
T,
�
M。
输出格式
输出一个整数,表示可以让你得救的总方案数,答案可能很大,请输出方案数除以
1000000007
输入
1 6 3
输出
5
#include <iostream>
int d,t,m;
int ans;
int dp[30][30];
int process(int cur,int step,int time)
{
if(dp[time][step]!=-1)
return dp[time][step];
if(time==0||step<0||cur<0)
{
if(step==0&&cur>0)
{
ans++;
ans=ans%1000000007;
}
return 0;
}
int p1=0,p2=0;
if(cur-1>0)
{
p1=process(cur-1,step,time-1);
}
if(step>0)
{
p2=process(cur+1,step-1,time-1);
}
dp[time][step]=p1+p2;
return p2+p1;
}
using namespace std;
int main()
{
cin>>d>>t>>m;
for(int i=0;i<30;i++)
{
for(int j=0;j<30;j++)
{
dp[i][j]=-1;
}
}
process(d,m,t);
cout<<ans;
return 0;
}
我想试试用的递归加上记忆化搜索,但是代码好像出错了,输出的结果一直是一,请指教