解题思路:

(好难,我看了大量别人写的题解弄出来的)
记忆化搜索+动态规划
参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<bits/stdc++.h>
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int maxn=55;
int n,m,k;
ll mp[maxn][maxn];
ll dp[maxn][maxn][15][15];
//i,j位置,sum(初始为0,此时还没有拿宝贝),max_(此时没有宝贝,即为-1)
ll dfs(int i,int j,int num,int max_) {
    //判断这个状态是否已经走过
    if(dp[i][j][num][max_+1]!=-1) {
        return dp[i][j][num][max_+1];
    }
    //到达出口
    if(i==n&&j==m) {
        if(num==k||num==k-1&&max_<mp[i][j]) {
            return dp[i][j][num][max_+1]=1;    //满足条件 ,当前1种方案
        else {
            return dp[i][j][num][max_+1]=0;    //不满足条件 ,当前0种方案
        }
    }
    //可以向下走
    ll s=0;
    if(i+1<=n) {
        if(max_<mp[i][j]) {
            s+=dfs(i+1,j,num+1,mp[i][j]);
        }
        s+=dfs(i+1,j,num,max_);
    }
    //可以向右走
    if(j+1<=m) {
        if(max_<mp[i][j]) {
            s+=dfs(i,j+1,num+1,mp[i][j]);
        }
        s+=dfs(i,j+1,num,max_);
    }
 
    return dp[i][j][num][max_+1]=s%1000000007;
}
int main() {
    hh;
    memset(mp,0,sizeof(mp));
    memset(dp,-1,sizeof(dp));
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin>>mp[i][j];
        }
    }
    dfs(1,1,0,-1);
    cout<<dp[1][1][0][0]<<endl;
    return 0;
}


点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论