//dp[k][i][j]:拥有k把锁,人位于i,j时走过的最大步数 #include<iostream> #include<vector> using namespace std; vector<int> dx{ 0,1,-1,0 }; vector<int> dy{ 1,0,0,-1 }; int max(int a, int b) {     return a>b ? a : b; } int main() {     int N, M, K;     cin >> N >> M >> K;     vector<vector<vector<int>>> dp(K + 1, vector<vector<int>>(N, vector<int>(M, 1)));     vector<vector<int>> Tmap(N, vector<int>(M));     for (int i = 0; i<N; i++)         for (int j = 0; j<M; j++)             cin >> Tmap[i][j];     bool key = true;     int result = 0;     while (key) {         key = false;         for (int k = 0; k <= K; k++) {             vector<vector<int>> dp0(dp[k]);             for (int i = 0; i<N; i++)                 for (int j = 0; j<M; j++) {                     int temp = dp[k][i][j];                     for (int dxy = 0; dxy<4; dxy++) {                         int x = i + dx[dxy], y = j + dy[dxy];                         if (x<0 || x >= N || y<0 || y >= M)continue;                         if (Tmap[x][y] >= Tmap[i][j]) {                             if (k<K)                                 dp[k][i][j] = max(dp[k][i][j], dp[k + 1][x][y] + 1);                         }                         else                             dp[k][i][j] = max(dp[k][i][j], dp0[x][y] + 1);                     }                     result = max(result, dp[k][i][j]);                     if (temp<dp[k][i][j])key = true;//dp有更新代表还有位置能走                 }         }     }     cout << result << endl;     return 0; }
点赞 1

相关推荐

一拳打爆地球66:我TM没看错吧,50块一天还985、211研究生优先?那个**会去?
点赞 评论 收藏
分享
饼子吃到撑:学院本是这样的,找工作拼运气,你技术再好人家筛选学历照样沉入海底,海投就行了
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务