DFS学习笔记

题目描述

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

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

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

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

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

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

输入格式

输入一行 3 个整数,用空格分开:n,m,k(1≤n,m≤50,1≤k≤12)。

接下来有 n 行数据,每行有 m 个整数 Ci​(0≤Ci​≤12) 代表这个格子上的宝物的价值。

输出格式

要求输出一个整数,表示正好取 k 个宝贝的行动方案数。该数字可能很大,输出它对 1000000007(109+7) 取模的结果。

输入输出样例

输入 #1复制

复制代码
2 2 2
1 2
2 1

输出 #1复制

复制代码
2

输入 #2复制

复制代码
2 3 2
1 2 3
2 1 5

输出 #2复制

复制代码
14
复制代码
#include<bits/stdc++.h>
#define ll long long
#define endl "\n";
using namespace std; 
int n,m,k;
int mem[55][55][15][15];
int a[55][55];
const ll mod=1e9+7;
ll dfs(int x,int y,int cn,int temp)//行,列,手里的宝藏数,手里的价值最高的宝物
{
    if(x>n||y>m)//行或列超范围
    {
        return 0;
    }
    if(mem[x][y][cn][temp]!=-1)//这条路同情况已经被走过了
    {
        return mem[x][y][cn][temp];//返回上一层
    }
    ll cnt=0;
    if(x==n&&y==m)//走到边界
    {
        if(cn==k||(cn==k-1&&a[x][y]>temp))//宝藏数刚好或宝藏数差一件且满足拿起的要求
        {
            cnt++;cnt%=mod;//情况加一种
        }
    }
    if(a[x][y]>temp)//宝藏比手里的都贵,可以拿起来
    {
        cnt+=dfs(x,y+1,cn+1,a[x][y]);//向右走
        cnt+=dfs(x+1,y,cn+1,a[x][y]);//向下走
    }
    cnt+=dfs(x,y+1,cn,temp);//没有拿起宝藏,向右
    cnt+=dfs(x+1,y,cn,temp);//没有拿起宝藏,向下
    mem[x][y][cn][temp]=cnt%mod;//记录该位置往后的可能,防止重复计算浪费算力
    return mem[x][y][cn][temp];//返回值
    
}
int main()
{
    memset(mem,-1,sizeof(mem));//清空四维数组同时赋初值为"-1"
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];//读入路径
        }
    }
    cout<<dfs(1,1,0,-1);//从第一行第一列位置开始,手里0个宝藏,手里宝藏价值为-1
    return 0;
}

对室友题解代码的解读,自加注释

相关推荐
知识分享小能手5 分钟前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
大筒木老辈子43 分钟前
Linux笔记---协议定制与序列化/反序列化
网络·笔记
草莓熊Lotso1 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
我爱挣钱我也要早睡!4 小时前
Java 复习笔记
java·开发语言·笔记
知识分享小能手6 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
汇能感知8 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun9 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao9 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾9 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT10 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习