刷题_9:另类加法 and 走方格的方案数

文章介绍了两道编程题,一是使用位运算符(&和^)实现加法,二是利用动态规划解决走方格的方案数问题。对于加法实现,通过循环和位运算进行无进位加法,然后处理进位。对于走方格问题,定义动态规划数组dp,通过状态转移方程计算每个位置的走法数量。
摘要由CSDN通过智能技术生成

一.另类加法

题目链接:

另类加法

题目描述:

给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。

示例1:

输入:
1, 2
输出:
3

个人总结:

使用位运算(&和^)实现简单的加法。

代码实现:

import java.util.*;

public class UnusualAdd {
    public int addAB(int A, int B) {
        // write code here
        while (B != 0) {
            //储存进位信息
            int add = (A & B) << 1;
            //进行不进位的二进制加法
            A ^= B;
            //将进位值赋值给B继续进行不进位的加法 直到 B == 0
            B = add;
        }
        return A;
    }
}

二.走方格的方案数

题目链接:

走方格的方案数

题目描述:

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围: 1≤n,m≤8

输入描述:

输入两个正整数n和m,用空格隔开。(1≤n,m≤8)

输出描述:

输出一行结果

示例1:

输入:
2 2
输出:
6

个人总结:

我们以一个3 * 4的格子来看该问题,图片如下,我们可以知道3 * 4的格子有4 * 5个落点,很显而易见的可以想到使用动态规划来解这类题,已知只能往右走和往下走,我们定义一个dp数组,其中dp[i][j]表示到达下标为[i,j]的格子的方案数,那么dp[i][j]是不是可以由它的左边(到达[i - 1, j]的方案数)和上面(到达[i,j - 1]的方案数)递推而来,所以状态转移方程为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1],在该基础上,进行一些边界处理就可以了。

在这里插入图片描述

这图画的是真丑呀,绷不住了!

代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] dp = new int[n + 1][m + 1];
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = 1;
                } else if (i == 0) {
                    dp[i][j] = dp[i][j - 1];
                } else if (j == 0) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        System.out.println(dp[n][m]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木是木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值