地宫取宝
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 55;
const long long mod = 1000000007;
int n, m, k, mp[N][N], ans;
int dx[2] = {0, 1};
int dy[2] = {1, 0};
ll dp[N][N][15][15];
///dp[x][y][num][maxvalue]:
///走到(x,y)位置(还没选入) 手中num个宝贝 最大值maxValue 的!方!案!数!
ll dfs(int x, int y, int num, int maxval)
{
///走到(x,y)位置 手中已拿num个宝贝 手中宝贝最大值maxValue
///这个方法进来就是为了求 dp[x][y][num][maxvalue],并返回它,好吗!
if(dp[x][y][num][maxval+1] != -1)
///只是记忆搜索加速处理,已经知道了dp就不用重复求了
return dp[x][y][num][maxval+1];
if(x==n && y==m)
{
///到达出口
if(num==k || (num==k-1 && mp[x][y] > maxval))
{
dp[x][y][num][maxval+1] = 1;
return 1;
}
else
{
///不成立返回0 后面s要叠加的
dp[x][y][num][maxval+1] = 0;
return 0;
}
}
ll s = 0; ///此刻 dp[x][y][num][maxvalue]的方案数
for(int i=0; i<2; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx <= n && yy <= m)
{
if(mp[x][y] > maxval)
s += dfs(xx, yy, num+1, mp[x][y]) % mod;///取
s += dfs(xx, yy,num,maxval) % mod;///不取
}
}
dp[x][y][num][maxval+1] = s % mod;///此刻 dp[x][y][num][maxvalue]的方案数求出了
return s % mod;
}
int main()
{
cin >> n >> m >> k;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> mp[i][j];
memset(dp, -1, sizeof dp);
dfs(1, 1, 0, -1);
cout << dp[1][1][0][0];
return 0;
}
博客包含地宫取宝的AC代码,与信息技术中算法实现相关。
821

被折叠的 条评论
为什么被折叠?



