地宫取宝

X 国王有一个地宫宝库,是 n×m 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。

地宫的入口在左上角,出口在右下角。

小明被带到地宫的入口,国王要求他只能向右或向下行走。

走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

当小明走到出口时,如果他手中的宝贝恰好是 k 件,则这些宝贝就可以送给小明。

请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这 k 件宝贝。


  package com.itheima.Test;

import java.util.Scanner;

public class _地宫取宝 {
    static int[][] data;
    private static int n;//行
    private static int m;//列
    private static int k;//宝物的个数
    private static int Mod=1000000007;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        k=sc.nextInt();
        data=new int[n][m];
        for(int i=0;i<n;i++){
            for (int j = 0; j < m; j++) {
                data[i][j]=sc.nextInt();
            }
        }
        long ans = dfs(0, 0, -1, 0);
        System.out.println(ans);

    }

    public static long dfs(int x,int y ,int max,int cnt){

        if(x==n||y==m){
            return 0;
        }
        int ans=0;
        int cur=data[x][y];//当前价值
        if(x==n-1&&y==m-1){
//            if(cur==k) ans++;//拿满了
//            if(cur==k-1&&cur>max)ans++; //差一个
            if(cnt==k||(cnt==k-1&&cur>max)) return 1;
            return ans;
        }

        if(cur>max){//如果当前价值超过最大价值
            ans+=dfs(x,y+1,cur,cnt+1);//往右走
            ans+=dfs(x+1,y,cur,cnt+1);//往下走
        }
        //超过价值不取的情况
        ans+=dfs(x,y+1,max,cnt);//往右走
        ans+=dfs(x+1,y,max,cnt);//往下走
        return ans%Mod;
    }
}



posted @ 2022-04-03 22:46  长情c  阅读(40)  评论(0)    收藏  举报