这题,简单的DP加上递归。
题目的意思,从任意一个起点出发,找一条最长的路径。
下面的是AC的代码:
#include <iostream> #include <cstring> using namespace std; int num[102][102]; int dp[102][102]; int r, c; int xy[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; int ans; int solve(int i, int j) { int max = -1; if(dp[i][j] != 0) return dp[i][j]; for(int k = 0; k < 4; k++) { int temp_i = i + xy[k][0]; int temp_j = j + xy[k][1]; if(temp_i >= 0 && temp_i < r && temp_j >= 0 && temp_j < c && num[temp_i][temp_j] < num[i][j]) { int res = solve(temp_i, temp_j); //递归,求解最长的 if(res > max) max = res; } } dp[i][j] = max + 1; return dp[i][j]; } int main() { int i, j; while(scanf("%d%d", &r, &c) != EOF) { memset(dp, 0, sizeof(dp)); ans = 0; for(i = 0; i < r; i++) for(j = 0; j < c; j++) scanf("%d", &num[i][j]); for(i = 0; i < r; i++) for(j = 0; j < c; j++) { int res = solve(i, j); ans = res > ans ? res : ans; } printf("%d\n", ans + 1); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-09 12:17:28