首页 > 试题广场 >

Shopee的办公室(二)

[编程题]Shopee的办公室(二)
  • 热度指数:9129 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
shopee的办公室非常大,小虾同学的位置坐落在右上角,而大门却在左下角,可以把所有位置抽象为一个网格(门口的坐标为0,0),小虾同学很聪明,每次只向上,或者向右走,因为这样最容易接近目的地,但是小虾同学不想让自己的boss们看到自己经常在他们面前出没,或者迟到被发现。他决定研究一下如果他不通过boss们的位置,他可以有多少种走法?


输入描述:
第一行 x,y,n (0<x<=30, 0<y<=30, 0<=n<= 20) 表示x,y小虾的座位坐标,n 表示boss的数量( n <= 20)

接下来有n行, 表示boss们的坐标(0<xi<= x, 0<yi<=y,不会和小虾位置重合)

x1, y1

x2, y2

……

xn, yn


输出描述:
输出小虾有多少种走法
示例1

输入

3 3 2
1 1
2 2

输出

4
太坑了Long
发表于 2022-03-18 21:38:15 回复(0)

用长整型存储数量

import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int x = in.nextInt();
        int y = in.nextInt();
        int n = in.nextInt();
        // 长整型
        long[][] dp = new long[x+1][y+1];
        for(int i = 0; i < n; i++){
            int bossx = in.nextInt();
            int bossy = in.nextInt();
            dp[bossx][bossy] = -1;
        }
        for(int i = 0; i <= x; i++){
            dp[i][0] = 1;
        }
        for(int j = 0; j <= y; j++){
            dp[0][j] = 1;
        }
        for(int i = 1; i <= x; i++){
            for(int j = 1; j <= y; j++){
                if(dp[i][j] == -1)
                    continue;
                if(dp[i-1][j] != -1)
                    dp[i][j] += dp[i-1][j];
                if(dp[i][j-1] != -1)
                    dp[i][j] += dp[i][j-1];
            }
        }
        System.out.println(dp[x][y]);
        return;
    }
}

发表于 2020-09-16 10:09:43 回复(0)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int y = sc.nextInt();
        int boss_num = sc.nextInt();
        //与其用数组去维护boss的坐标位置,不如直接在表里填-1,表示不可走
        long[][] mv = new long[x+1][y+1];//因为从0开始到y,所以空间是y+1;
        for(int i=0;i<boss_num;i++) {
            mv[sc.nextInt()][sc.nextInt()]=-1;
        }
        long res = count_mv(x,y,mv);
        System.out.println(res);
    }
    // 思路:维系一个动态规划表,表格下标代表位置
    //当自己的位置在(i,j)时候,走法一共有 mv[i][j]=mv[i][j-1]+mv[i-1][j]
    //因为都表示只差一步就到(i,j),所以情况相加就行
    //考虑到对称性,决定只填上三角形,"但这是不对"!,只填上三角形存在一种情况,上一行那个数是老板位置为0,你无法*2
    //会漏掉前一列可以行走的可能性!
    //因此需要初始化第一行来符合上面的公式,
    private static long count_mv(int x, int y,long[][] mv) {
        //初始化
        for(int i=0;i<=y;i++) {
            mv[0][i]=1;//在同一行的时候,只有1种情况,右移
        }
        for(int i=0;i<=x;i++) {
            mv[i][0]=1;//同一列只有一种情况
        }
        //填表,按行、上三角形填
        for(int i=1;i<=x;i++) {
            for(int j=1;j<=y;j++) {
                if(mv[i][j] == -1) mv[i][j]=0; //老板位置不走,走法为0  
                else    mv[i][j]=mv[i][j-1]+mv[i-1][j];
            }
        }
        return mv[x][y];
    }
}
发表于 2019-09-14 11:29:52 回复(4)

热门推荐

通过挑战的用户

查看代码
Shopee的办公室(二)