记忆话题搜索 蓝桥杯 地宫寻宝
所谓记忆化搜索 就是在搜索的基础上对一些状态进行记录 下次同样状态访问的时候 就不需要重复计算了 典型的空间换取时间的套路
有几点要注意的就是这个东西的使用范围 我个人的感觉是要分析清楚状态转移的过程 这道题目里面的状态分析就有很多子问题是有重复 记忆化搜索是有一定动态规划思想的 巧妙的结合 我们知道 动态规划是要遍历所有情况的 如果用动态规划求解这道题目 势必是要超时的
#include<iostream>
#include<string.h>
using
namespace
std;
long
long
dp[60][60][15][15];
int
map[60][60];
int
k,N,M;
void
dfs(
int
n,
int
m,
int
k1,
int
c){
if
(dp[n][m][k1][c]!=-1)
return
;
dp[n][m][k1][c]=0;
if
(k1==k&&n==N&&m==M) dp[n][m][k1][c]=1;
if
(map[n][m]>c&&k1<k){
dfs(n,m,k1+1,map[n][m]);dp[n][m][k1][c]+=dp[n][m][k1+1][map[n][m]];
dp[n][m][k1][c]%=1000000007;
}
if
(n<N) {
dfs(n+1,m,k1,c);dp[n][m][k1][c]+=dp[n+1][m][k1][c];
dp[n][m][k1][c]%=1000000007;
}
if
(m<M){
dfs(n,m+1,k1,c);dp[n][m][k1][c]+=dp[n][m+1][k1][c];
dp[n][m][k1][c]%=1000000007;
}
}
int
main(){
cin>>N>>M>>k;
for
(
int
i=1;i<=N;i++){
for
(
int
j=1;j<=M;j++){
cin>>map[i][j];map[i][j]++;
}
}
memset
(dp,-1,
sizeof
(dp));
dfs(1,1,0,0);
cout<<dp[1][1][0][0]<<endl;
return
0;
}