题目说了只能向下或者向右走,且面对每一个最大价值物品时都有取和不取两种选择。且在最后走出地宫时小明拿的物品数量必须刚好是K个物品。
地宫最大是50行50列,用dfs写如下代码。
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+10;
int g[50][50];
int ans;
int n,m,k;
void dfs(int x,int y,int Max,int cnt)
{
int cur=g[x][y];
//越界的情况
if(x==n||y==m)return;
//即将面临最后一步
if(x==n-1&&y==m-1)
{
if(cnt==k)
{
ans++; //如果此时cnt已经满足了 k ,那么最后一个物品拿不拿都无所谓
if(ans>MOD)ans%=MOD;
}
if(cnt==k-1&&cur>Max)
{
ans++; //如果还差一件才拿够 并且最后一件商品价值较大,那就拿上
if(ans>MOD)ans%=MOD;
}
}
if(cur>Max) //如果当前格子中的宝贝价值比小明手中任何宝贝的价值都大 就可以取(也可以不拿)
{
//拿的情况
dfs(x,y+1,cur,cnt+1); //cur更新为最大价值
dfs(x+1,y,cur,cnt+1); //cur更新为最大价值
}
//面对当前格子中的物品价值较小 或价值较大时 不拿的情况
dfs(x,y+1,Max,cnt); //不拿的话Max保持不变
dfs(x+1,y,Max,cnt); //不拿的话Max保持不变
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
dfs(0,0,-1,0);
cout<<ans<<endl;
return 0;
}
因为每次都有四种选择:
向右走取当前物品
向右走不取当前物品
向下走取当前物品
向下走不取当前物品
而整个地图是50×50的,也就是需要向右走50次,向下走50次,要走100个点。每个点除了边界外都有四种选择。
也就是总共有 种选择,我们知道可以看做就是是,大概,所以一定超过了