zoukankan      html  css  js  c++  java
  • leetcode 1269 停在原地的方案数

    package com.example.lettcode.dynamicprogramming;
    
    /**
     * @Class NumWays
     * @Description 1269 停在原地的方案数
     * 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。
     * 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。
     * 给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。
     * 由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。
     * <p>
     * 示例 1:
     * 输入:steps = 3, arrLen = 2
     * 输出:4
     * 解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。
     * 向右,向左,不动
     * 不动,向右,向左
     * 向右,不动,向左
     * 不动,不动,不动
     * <p>
     * 示例 2:
     * 输入:steps = 2, arrLen = 4
     * 输出:2
     * 解释:2 步后,总共有 2 种不同的方法可以停在索引 0 处。
     * 向右,向左
     * 不动,不动
     * <p>
     * 示例 3:
     * 输入:steps = 4, arrLen = 2
     * 输出:8
     * @Author
     * @Date 2021/5/13
     **/
    public class NumWays {
        /**
         * DP
         *
         * @param steps
         * @param arrLen
         * @return
         */
        public static int numWays(int steps, int arrLen) {
            if (steps == 0 || arrLen == 0) return 0;
    
            final int MODULO = 1000000007;
            // 右移位置不会超过所允许的最大步数
            int maxColumn = Math.min(steps, arrLen - 1);
            // dp[i][j] 表示第i步后,在索引j处的方案数
            int[][] dp = new int[steps + 1][maxColumn + 1];
            // 初始条件
            dp[0][0] = 1;
            for (int i = 1; i <= steps; i++) {
                for (int j = 0; j <= maxColumn; j++) {
    //                if (j == maxColumn) {
    //                    dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % MODULO;
    //                } else if (j == 0) {
    //                    dp[i][j] = (dp[i - 1][j] + dp[i - 1][j + 1]) % MODULO;
    //                } else {
    //                    dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j] + dp[i - 1][j + 1]) % MODULO;
    //                }
                    dp[i][j] = dp[i - 1][j];
                    if (j + 1 <= maxColumn) {
                        dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % MODULO;
                    }
                    if (j - 1 >= 0) {
                        dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % MODULO;
                    }
                }
            }
            return dp[steps][0];
        }
    }
    
    // 测试用例
    public static void main(String[] args) {
    	int steps = 3;
    	int arrLen = 2;
    	int ans = NumWays.numWays(steps, arrLen);
    	System.out.println("NumWays demo01 result : " + ans);
    
    	steps = 2;
    	arrLen = 4;
    	ans = NumWays.numWays(steps, arrLen);
    	System.out.println("NumWays demo02 result : " + ans);
    
    	steps = 4;
    	arrLen = 2;
    	ans = NumWays.numWays(steps, arrLen);
    	System.out.println("NumWays demo03 result : " + ans);
    
    	steps = 430;
    	arrLen = 148488;
    	ans = NumWays.numWays(steps, arrLen);
    	System.out.println("NumWays demo04 result : " + ans);
    }
    
  • 相关阅读:
    Java中返回参数值的几种状态
    Java中的二维数组
    Java foreach操作(遍历)数组
    Arrays 类操作 Java 的数组排序
    Java循环语句 for
    Java循环语句 while
    Java条件语句 switch case
    Java多重if....else if
    margin优化的一种思路
    5.命名规则
  • 原文地址:https://www.cnblogs.com/fyusac/p/14764811.html
Copyright © 2011-2022 走看看