69,382
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define N 1000000007
int map[55][55];
int dp[55][55][15][15]; //dp[i][j][k][n]代表到map[i][j]时最大值为k,当前有n个物品
int m, n, k;
int dfs(int i, int j, int max, int num){
if (dp[i][j][max][num] != -1)
return dp[i][j][max][num];
//如果到达边界
if (i == n){
/*if (j == m - 1 && num == k)
return 1;*/
return 0;
}
int t = 0;
if (map[i][j] > max && num < k){
if (i < n - 1 || j == m - 1)
t = (t + dfs(i + 1, j, map[i][j], num + 1)) % N;
if (j < m - 1)
t = (t + dfs(i, j + 1, map[i][j], num + 1)) % N;
}
if (i < n - 1 || j == m - 1)
t = (t + dfs(i + 1, j, max, num)) % N;
if (j < m - 1)
t = (t + dfs(i, j + 1, max, num)) % N;
return dp[i][j][max][num] = t;
}
int main(){
scanf_s("%d%d%d", &n, &m, &k);
int i, j;
//srand(unsigned(time(NULL)));
for (i = 0; i < n; i++){
for (j = 0; j < m; j++){
/*map[i][j] = rand() % 12;
printf("%d ", map[i][j]);*/
scanf_s("%d", &map[i][j]);
}
printf("\n");
/*scanf("%d", &map[i][j]);*/
}
memset(dp, -1, sizeof(dp));
for (i = 0; i < 15; i++)
dp[n][m - 1][i][k] = 1;
printf("%d\n", dfs(0, 0, 0, 0));
return 0;
}