如何用java实现话说大诗人李白,一生好饮。 幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。 他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路...

你可以使用动态规划的思想来解决这道题。

首先,定义状态 $dp[i][j]$ 表示已经遇到了 $i$ 次店和 $j$ 次花时的方案数。

其次,考虑状态转移方程。在遇到店时,可以选择加倍或不加倍,因此 $dp[i][j]=dp[i-1][j]+dp[i-1][j-1]$。在遇到花时,只能选择喝酒,因此 $dp[i][j]=dp[i][j-1]$。

最后,由于在遇到花之前必须要有酒,所以 $dp[0][j]=0$。

因此,最终的状态转移方程为:

$$ dp[i][j]= \begin{cases} dp[i-1][j]+dp[i-1][j-1] & i \neq 0 \ dp[i][j-1] & i=0 \end{cases} $$

最后,答案即为 $dp[N][M]$。

下面是 Java 代码:

import java.util.Scanner;

public class Main {
    static final int MOD = 1000000007;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        sc.close();

        int[][] dp = new int[N + 1][M + 1];
        dp[0][0] = 1;
        for (int i = 0; i <= N; i++) {
            for (int j = 1; j <= M; j++) {
                if (i > 0) {
                    dp[i][j] = (dp[i][j] + dp[i - 1][j] + dp[i - 1][j - 1]) % MOD;
                } else {
                    dp[i][j] = (dp[i][j] + dp[i][j - 1]) % MOD;
                }
            }
        }

        System.out.println(dp[N][M]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值