问题描述
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入格式
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
输出格式
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 2 2
1 2
2 1
样例输出
2
样例输入
2 3 2
1 2 3
2 1 5
样例输出
输出结果:
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入格式
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
输出格式
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 2 2
1 2
2 1
样例输出
2
样例输入
2 3 2
1 2 3
2 1 5
样例输出
14
分析: 数据规模小,直接暴力dfs
/**
* @author 慕一春
* @version 1.0.0
* @filename Main.java
* @time 2016年6月15日16:18:40
* @copyright(C) 2016
*/
final public class Main {
public static final int N = 2; //迷宫 长
public static final int M = 3; //迷宫 宽
public static final int K = 2; //所需宝物数
public static int arr[][] = {{1,2,3},{2,1,5}}; //宝物价值
public static int count = 0; // 取法
public static void main(String[] args){
dfs(0,0,0,0);
System.out.println(count); // 总取法
}
/**
*
* @param x 当前x轴坐标
* @param y 当前y轴坐标
* @param nums 当前宝物数
* @param max 当前拥有宝物的最大价值
*/
public static void dfs(int x, int y, int nums, int max) {
if (x >= N || y >= M || nums > K) return ; // 回溯
else{
if (N - 1 == x && M - 1 == y){ // 抵达出口
if (nums == K) // 不拿宝物
count = (count+1) % 1000000007;
if (nums == K - 1 && arr[x][y] > max) // 拿宝物
count = (count+1) % 1000000007;
}else{
if(arr[x][y] > max){ //拿宝物
dfs(x+1, y, nums+1, arr[x][y]); //向下走
dfs(x, y+1, nums+1, arr[x][y]); //向右走
}
dfs(x+1, y, nums, max); //不拿宝物
dfs(x, y+1, nums, max);
}
}
}
}
输出结果:
14