思路都写在注释里面呢,大家直接看就行。
Java 代码
import java.util.*;
public class Main{
static long res = 0;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int D = input.nextInt();
int T = input.nextInt();
int M = input.nextInt();
//最终你距离峡谷的距离是固定的
//D - (T - M) + M = D - T + 2M
if(D - T + 2*M <= 0) {
System.out.println(0);
return;
}
//dp[i][j] 表示过了i秒,用了j体力的方案数
//dp[i][j]
//如果第 i 秒往上游,dp[i][j] = dp[i-1][j-1]的方案数,前提是dp[i-1][j-1]合法
//如果第 i 秒不往上游,需要判断dp[i][j]是否合法,如果合法dp[i][j] += dp[i-1][j],因为i秒才往上游了j次都能活下来,i-1秒肯定可以
int[][] dp = new int[T+1][M+1];
dp[0][0] = 1;
//dp数组如何初始化?dp[0][0] = 1,0秒用了0体力是一种方案
for(int i = 1 ; i <= T ; i++){
for(int j = 0; j <= Math.min(i,M) ; j++){
if(D - i + 2 * j <= 0) continue;
dp[i][j] = dp[i-1][j];
//D - (i-1) + 2 *( j - 1)
//D - i + 2 * j - 1
if(j > 0&&D-i+2*j-1 > 0) dp[i][j] = (dp[i][j] + dp[i-1][j-1]) % 1000000007;
}
}
System.out.println(dp[T][M]);
}
}