思路
看数据范围很容易想到用动态规划解决
一维存时间,一维存体力
关键在于如何表示当前状态的位置是否安全
观察状态可以得出,通过当前时间和消耗体力可以计算出离起点的距离
例如经过i秒,体力消耗j,则在i秒中,有j秒划桨了,有i-j秒没有划桨,故距离起点的位置为-j+(i-j)
状态转移则是由划桨和不划桨两种状态而来
c++代码
#include <iostream>
using namespace std;
const int N = 3010, M = 1510;
const int mod = 1000000007;
int d, t, m;
int f[N][M]; //f[i][j]表示经过i秒,体力消耗j时的方案数 j<=i 此时距离起点的位置-j+(i-j)
int main()
{
cin >> d >> t >> m;
f[0][0] = 1;
for (int i = 1; i <= t; i ++ )
{
for (int j = 0; j <= min(i, m); j ++ )
{
if (i - j * 2 < d) //不划,则当前状态安全
f[i][j] = f[i - 1][j];
if (j != 0 && i - 1 - (j - 1) * 2 < d) //划,则上一秒状态安全
f[i][j] = (f[i][j] + f[i - 1][j - 1]) % mod;
}
}
cout << f[t][m];
return 0;
}
在第二个if中加上j!=0的条件是不是更好呢,j-1可能等于-1吧,也是一张违法状态
对!已修改!