题目大意:求矩阵中最长递减路径的长度。
解析:有两种解法,一种是dfs,还有一种是dp,因为最大的矩阵为100*100,所以直接暴力dfs就可以过。
dp解法:先把点的坐标和数值存于结构体中,然后将结构体从小到大排序,然后按照数值从小到大dp
如果当前点周围的高度h[newx][newy] > h[x][y],且dp[x][y] >= dp[newx][newy]
dp解法:
解析:有两种解法,一种是dfs,还有一种是dp,因为最大的矩阵为100*100,所以直接暴力dfs就可以过。
dp解法:先把点的坐标和数值存于结构体中,然后将结构体从小到大排序,然后按照数值从小到大dp
如果当前点周围的高度h[newx][newy] > h[x][y],且dp[x][y] >= dp[newx][newy]
那么dp[newx][newy] = dp[x][y] + 1;
dfs解法:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
const int dx[] = {-1,0,1,0};
const int dy[] = {0,-1,0,1};
int h[N][N];
int r,c;
int maxh;
void dfs(int x,int y,int sum) {
int newx , newy;
if(sum > maxh) {
maxh = sum;
}
for(int i = 0; i < 4; i++) {
newx = x + dx[i];
newy = y + dy[i];
if(newx < 0 || newx >= r || newy < 0 || newy >= c) {
continue;
}
if(h[newx][newy] < h[x][y]) {
dfs(newx,newy,sum+1);
}
}
}
int main() {
int T;
char name[N];
scanf("%d",&T);
while(T--) {
scanf("%s%d%d",name,&r,&c);
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
scanf("%d",&h[i][j]);
}
}
maxh = -INF;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
dfs(i,j,0);
}
}
printf("%s: %d\n",name,maxh+1);
}
return 0;
}
dp解法:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
const int dx[] = {-1,0,1,0};
const int dy[] = {0,-1,0,1};
struct Point {
int x,y,h;
Point() {}
Point(int _x,int _y,int _h) {
x = _x;
y = _y;
h = _h;
}
}p[N*N];
int h[N][N];
int dp[N][N];
int r,c;
bool cmp(Point a,Point b) {
return a.h < b.h;
}
void update(int x,int y) {
int newx,newy;
int tmp[4];
for(int i = 0; i < 4; i++) {
newx = x + dx[i];
newy = y + dy[i];
if(newx < 0 || newx >= r || newy < 0 || newy >= c) {
continue;
}
if(h[newx][newy] > h[x][y] && dp[x][y] >= dp[newx][newy]) {
dp[newx][newy] = dp[x][y] + 1;
}
}
}
int main() {
int T;
char name[N];
scanf("%d",&T);
while(T--) {
scanf("%s%d%d",name,&r,&c);
int tot = 0;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
scanf("%d",&h[i][j]);
p[tot++] = Point(i,j,h[i][j]);
}
}
sort(p,p+tot,cmp);
memset(dp,0,sizeof(dp));
for(int i = 0; i < tot; i++) {
update(p[i].x,p[i].y);
}
int maxh = -INF;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
maxh = max(maxh,dp[i][j]);
}
}
printf("%s: %d\n",name,maxh+1);
}
return 0;
}