解题思路:

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

#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分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论