<pre name="code" class="cpp">#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int NN = 1000000007;
const int N = 50, M = 50, C=14, K=13;
int maze[M + 1][N + 1];
int dp[M + 1][N + 1][K][C];
int k, n, m;
int Comb(int r, int c, int num, int nMax)//num是手头上的物品,nMax手头上最大物品数量
{
if (dp[r][c][num][nMax] != -1)
return dp[r][c][num][nMax];
if (r == n && c == m)
{
if (num == k)
return 1;
else
return 0;
}
if (nMax == 13 && num < k)//提前剪枝,已经手头上最重物品已经=12,后面不能再取物品,
return dp[r][c][num][nMax] = 0;
//其实根据组合数计算可以进一步
//if (nMax == 13 && num = k)
// return dp[r][c][num][nMax] = 组合数;
int nCount = 0;
if (c < m)
{
if (maze[r][c + 1] > nMax)//比手头上最重物品中,考虑加入
nCount = Comb(r, c + 1, num + 1, maze[r][c + 1]);
if ((n + m) - (r + c) > (k - num))//剪枝
nCount += Comb(r, c + 1, num, nMax);
}
if (r < n)
{
if (maze[r + 1][c] > nMax)
nCount = nCount % NN + Comb(r + 1, c, num + 1, maze[r + 1][c]);
if ((n + m) - (r + c) > (k - num))//剪枝
nCount = nCount % NN + Comb(r + 1, c, num, nMax);
}
return dp[r][c][num][nMax] = nCount % NN;
}
int main()
{
while (cin >> n >> m >> k)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> maze[i][j];
maze[i][j]++;
}
}
memset(dp, -1, sizeof(dp));
int nc;
nc = Comb(1, 1, 0, 0) + Comb(1, 1, 1, maze[1][1]);
cout << nc % NN << endl;
}
//system("pause");
return 0;
}
蓝桥杯 地宫取宝
最新推荐文章于 2021-11-09 10:01:28 发布