1 #include
2 #include <string.h>
3 #define N 1000000007
4 int n,m,k;
5 int map[50][50];
6 int vis[50][50][15][15];//vis数组中记录的是状态 xy坐标 拥有宝物数量 拥有宝物的最大值(这4个可以详尽唯一的描述没一种可能)
7 // 如 vis[3][4][5][6]=7 即当在map[3][4]且身上有5件宝物 宝物的最大值是6 是到达终点有7中路径
8
9 int dfs(int x,int y,int num,int max)//当前位置 拥有宝物的数量 拥有的宝物的最大值
10 {
11 if (vis[x][y][num][max+1]!=-1)//因为宝物有可能为0所以定义max时用最小值-1 这就导致无法作为下标使用 实际上如果测试数据中宝物价值没有0 将所有的+1 去掉也是可以的
12 {
13 return vis[x][y][num][max+1];
14 }//记忆化的记忆就指的是上面
15 if(x==n&&y==m)
16 {
17 if(num==k)return vis[x][y][num][max+1]=1;//满足条件 当前点到目标有1种方案
18 else if(num==k-1&&max