走方格的方案数
描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围: 1≤�,�≤8 1≤n,m≤8
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
示例1
输入:
2 2
复制输出:
6
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int[][] dp=new int[m+1][n+1];
for(int i=0;i<=m;i++){
dp[i][0]=1;
}
for(int j=0;j<=n;j++){
dp[0][j]=1;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
//当前的数量为相邻两个数量相加
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
System.out.println(dp[m][n]);
}
}
另类加法
1. 二进制位异或运算相当于对应位相加,不考虑进位 比如:
1 ^ 1 = 0 ---> 1 + 1 = 0 (当前位值为0,进一位)
1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1) 0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)
2. 二进制位与运算左移一位相当于对应位相加之后的进位 比如:
1 & 1 = 1 ---> 1 + 1 = 0
(当前位的值进一位) 1 & 0 = 0 ---> 1 + 0 = 1
(当前位的值不进位) 0 & 0 = 0 ---> 0 + 0 = 0
(当前位的值不进位)
3. 两个数相加:
对应二进制位相加的结果 + 进位的结果
比如:3 + 2 --> 0011 + 0010 --> 0011 ^ 0010 + ((0011 & 0010)
(0011 ^ 0010) ^ ((0011 & 0010) << 1), 当进位之后的结果为0时,相加结束
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
// write code here
if(B==0){
return A;
}
int sum=0;
int carry=0;
while(B!=0){
//异或相当于对应位相加,不考虑进位
sum=A^B;
//与运算相当于对应位相加之后的进位
carry=(A&B)<<1;
A=sum;
B=carry;
}
return sum;
}
}