地宫取宝---dfs‘记忆

#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef  long long ll;
typedef pair<ll,int> pii;
int n,m,k;
int v[52][52];
ll dp[52][52][15][15];///dfs几个变量就开几维 
ll mod=1000000000+7;
ll dfs(int x,int y,int c,int ma)
{
	if(x==n&&y==m&&c==k) return 1;///符合条件 
	if(dp[x][y][c][ma+1]!=-1) return dp[x][y][c][ma+1]%mod;///记忆化剪枝 
	if(x<1||x>n||y<1||y>m||c>k) return 0;///越界或超k 
	ll w=0,e=0;
	if(x+1<=n)///访问数组不越界 
	{
	if(v[x+1][y]>ma)///v大于ma,有两种选择 
		w=(dfs(x+1,y,c+1,v[x+1][y])+dfs(x+1,y,c,ma))%mod;
	else w=dfs(x+1,y,c,ma);///小于只有一种 
	}
	if(y+1<=m)
	{
	if(v[x][y+1]>ma)
		e=(dfs(x,y+1,c+1,v[x][y+1])+dfs(x,y+1,c,ma))%mod;
	else e=dfs(x,y+1,c,ma);
	}
	return dp[x][y][c][ma+1]=(w+e)%mod;///最后return 当前 
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>v[i][j];
	memset(dp,-1,sizeof(dp));
	dfs(1,1,0,-1);///玄妙,因为价值里有0,所以不取初始不能为0 
	ll w=dp[1][1][0][0]%mod;///ma+1 
	memset(dp,-1,sizeof(dp));
	dfs(1,1,1,v[1][1]);
	ll e=(w+dp[1][1][1][v[1][1]+1])%mod;
	cout<<e;///两种情况,w=第一个取不 ,另一种使第一个取 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值