input:
3 1
1 2 5
10 11 6
12 12 7
-1 -1v
output:
37
题目大意:
一个n×n的矩阵,老鼠每次只能吃比上大的食物所在的区域,每次老鼠只能垂直或者水平移动[1,k]步,求老鼠最
多能吃多少食物。
分析:
dp+dfs。跟滑雪有点类似,dp[i][j]=(i,j)位置位置最多能吃多少食物。利用dfs查找那些dp[i][j]==0的区域,
比较四个方向上,并取最大值赋给dp[i][j]。
code:
#define frp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll inf = 0x7fffff;
const int maxn = 1000;
const int MAXN = 1050;
int n, k;
int dp[MAXN][MAXN], a[MAXN][MAXN];
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
bool inside(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= n;
}
int dfs(int i, int j) {
if (dp[i][j])return dp[i][j];
int ans = 0;
for (int l = 0; l < 4; ++l) {
for (int m = 1; m <= k; m++) {
int x = i + dir[l][0] * m;
int y = j + dir[l][1] * m;
if (inside(x, y) && a[i][j] < a[x][y]) {
ans = max(ans, dfs(x, y));
}
}
}
// cout<<ans<<endl;
return dp[i][j] = ans + a[i][j];
}
void solve() {
while (cin >> n >> k&&n!=-1&&k!=-1) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin>>a[i+1][j+1];
// cout<<a[i+1][j+1]<<" ";
}
// cout<<endl;
}
int ans=-1;
cout<<dfs(1,1)<<endl;
memset(dp,0, sizeof(dp));
// cout << n << " " << k << endl;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef frp
freopen("D:\\coding\\c_coding\\in.txt", "r", stdin);
// freopen("D:\\coding\\c_coding\\out.txt", "w", stdout);
#endif
solve();
return 0;
}