BFS搜索
#include "stdio.h"
#include "string.h"
#define MAX(a, b) ((a)>(b)?(a):(b))
#define MIN(a, b) ((a)<(b)?(a):(b))
int n, m;
int map[21][1001];
int max[21][1001];
typedef struct _Node{
int u, v;
}Node, *pNode;
Node que[200000];
int fro, end;
int dir[2][2] = {{1, 0}, {0, 1}};
int check(int u, int v){
return u<=n && v<=m;
}
void cal(){
Node k;
int nu, nv;
int d;
que[0].u = que[0].v = 1;
fro = 0; end = 1;
memset(max, 0x80, sizeof(max));
max[1][1] = map[1][1];
while(fro<end){
k = que[fro++];
for(d=0; d<2; d++){
nu = k.u+dir[d][0]; nv = k.v+dir[d][1];
if(!check(nu, nv)) continue;
if(max[nu][nv] < max[k.u][k.v]+map[nu][nv]){
max[nu][nv] = max[k.u][k.v]+map[nu][nv];
que[end].u = nu;
que[end].v = nv;
end++;
}
}
nu = k.u; nv = k.v;
for(d=1; check(nu, nv+k.v); d++){
nv += k.v;
if(max[nu][nv] < max[k.u][k.v]+map[nu][nv]){
max[nu][nv] = max[k.u][k.v]+map[nu][nv];
que[end].u = nu;
que[end].v = nv;
end++;
}
}
}
printf("%d\n", max[n][m]);
}
void main(){
int c;
int i, j;
freopen("in.txt", "r", stdin);
scanf("%d", &c);
while(c--){
scanf("%d %d", &n, &m);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d", &(map[i][j]));
cal();
}
}