HDU

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;
}

  

原文地址:https://www.cnblogs.com/visualVK/p/9727410.html