用暴力搜索会超时,改为记忆化搜索,就是DP。
#include <cstdio>
#include <string.h>
#define MAX 50 + 10
#define MOD 1000000007
int n, m, k;
int MGraph[MAX][MAX];
int dp[MAX][MAX][MAX][MAX];
//int ans = 0;
/*
void dfs( int curX, int curY, int curSum, int curMax ) {
if( curX >= n || curY >= m ) return; // 剪枝
if( curSum > k ) return; // 剪枝
// 走到终点并找到解
if( curX == n - 1 && curY == m - 1 ) {
if( ( curSum == k ) || ( ( curSum == k - 1 ) && MGraph[curX][curY] > curMax ) )
ans = ( ans + 1 ) % 1000000007;
return;
}
// 如果可以拿
if( MGraph[curX][curY] > curMax ) {
// 拿
dfs( curX + 1, curY, curSum + 1, MGraph[curX][curY] );
dfs( curX, curY + 1, curSum + 1, MGraph[curX][curY] );
// 不拿
dfs( curX + 1, curY, curSum, curMax ); // 向下
dfs( curX, curY + 1, curSum, curMax ); // 向右
}
// 不能拿
else {
dfs( curX + 1, curY, curSum, curMax ); // 向下
dfs( curX, curY + 1, curSum, curMax ); // 向右
}
if( curX + 1 < n ) {
if( MGraph[curX][curY] > curMax ) {
dfs( curX + 1, curY, curSum + 1, MGraph[curX][curY] );
}
dfs( curX + 1, curY, curSum, curMax );
}
if( curY + 1 < m ) {
if( MGraph[curX][curY] > curMax ) {
dfs( curX, curY + 1, curSum + 1, MGraph[curX][curY] );
}
dfs( curX, curY + 1, curSum, curMax );
}
}
*/
int dfs( int curX, int curY, int curSum, int curMax ) {
if( dp[curX][curY][curSum][curMax] != -1 ) {
return dp[curX][curY][curSum][curMax];
}
if( curX >= n || curY >= m ) return 0; // 剪枝
if( curSum > k ) return 0; // 剪枝
// 走到终点并找到解
if( curX == n - 1 && curY == m - 1 ) {
if( ( curSum == k ) || ( ( curSum == k - 1 ) && MGraph[curX][curY] > curMax ) )
return dp[curX][curY][curSum][curMax] = 1;
return dp[curX][curY][curSum][curMax] = 0;
}
int t = 0;
// 如果可以拿
if( MGraph[curX][curY] > curMax ) {
// 拿
t = ( t + dfs( curX + 1, curY, curSum + 1, MGraph[curX][curY] ) ) % MOD;
t = ( t + dfs( curX, curY + 1, curSum + 1, MGraph[curX][curY] ) ) % MOD;
// 不拿
t = ( t + dfs( curX + 1, curY, curSum, curMax ) ) % MOD; // 向下
t = ( t + dfs( curX, curY + 1, curSum, curMax ) ) % MOD; // 向右
}
// 不能拿
else {
t = ( t + dfs( curX + 1, curY, curSum, curMax ) ) % MOD; // 向下
t = ( t + dfs( curX, curY + 1, curSum, curMax ) ) % MOD; // 向右
}
return dp[curX][curY][curSum][curMax] = t % MOD;
}
int main() {
memset( dp, -1 , sizeof( dp ) );
scanf( "%d%d%d", &n, &m, &k );
for( int i = 0; i < n; i++ ) {
for( int j = 0; j < m; j++ ) {
scanf( "%d", &MGraph[i][j] );
MGraph[i][j]++;
}
}
int ans = dfs( 0, 0, 0, 0 );
printf( "%d\n", ans );
return 0;
}