There is an algorithmic improvement: in your case, the complexity may be O(N), where Nis the number of points in your image.
- . O(mn), N - node m .
, acyclic: . - " " ( ) " " ( ). . , , O(n+m)!
, - , . , ! . :
i==0 && j==0: . .i==0 && j!=0: . - . , .i!=0 && j==0: . - . , .i!=0 && j!=0: . , (i-1,j) (i,j-1) . (i,j) (i,j).
. ( max?).
:
1 3 8 9 11 s l l l l
:
1 3 8 9 11 s l l l l
4 6 9 11 12 u l u lu lu
Thrid:
1 3 8 9 11 s l l l l
4 6 9 11 12 u l u lu lu
5 10 13 15 16 u u l l l
:
1 3 8 9 11 s l l l l
4 6 9 11 12 u l u lu lu
5 10 13 15 16 u u l l l
8 11 15 17 19 u u u lu l
, . : , - !
, . , DDRRRDR n-1 D () m-1 R (). -distance(DDRRRDR), D R.
( ), gcc main.c -o main -Wall. EDIT: .
# include <stdio.h>
# include <stdlib.h>
typedef enum {S,L,U,LU} Direction;
int main(void)
{
FILE * pFile;
int n=1,m=1,i,j;
int* image;
pFile = fopen ("image.txt","r");
if (pFile!=NULL)
{
if(fscanf(pFile,"%d%d",&n,&m)!=2){printf("read failed\n");exit(1);}
image=malloc(n*m*sizeof(int));
if(image==NULL){printf("malloc failed\n");exit(1);}
for(i=0;i<n*m;i++){
if(fscanf(pFile,"%d",&image[i])!=1){printf("read failed %d\n",i);exit(1);}
}
fclose (pFile);
}else{printf("file open failed\n");exit(1);}
Direction* directions=malloc(n*m*sizeof(Direction));
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(i==0 && j==0){
directions[i*m+j]=S;
}
if(j==0 && i>0){
directions[i*m+j]=U;
}
if(j>0 && i==0){
directions[i*m+j]=L;
}
if(j>0 && i>0){
if(image[i*m+(j-1)]>image[(i-1)*m+j]){
directions[i*m+j]=L;
}else{
if(image[i*m+(j-1)]<image[(i-1)*m+j]){
directions[i*m+j]=U;
}else{
directions[i*m+j]=LU;
}
}
}
if(directions[i*m+j]==L){
image[i*m+j]+=image[i*m+j-1];
}else{
if(directions[i*m+j]==U || directions[i*m+j]==LU){
image[i*m+j]+=image[(i-1)*m+j];
}
}
}
}
printf("max distance is %d\n",image[n*m-1]);
printf("A path from the end is\n");
char path[n+m-1];
path[n+m-2]='\0';
int cnt=n+m-3;
i=n-1;
j=m-1;
printf("(%d %d)\n",i,j);
while(i!=0 || j!=0){
if(directions[i*m+j]==LU){printf("many possible max path. going left\n");}
if(directions[i*m+j]==U){
printf("D ");
path[cnt]='D';
i--;
}else{
printf("R ");
path[cnt]='R';
j--;
}
cnt--;
printf("(%d %d)\n",i,j);
}
printf("A max path is %s\n",path);
free(directions);
free(image);
return 0;
}
image.txt, :
4 5
1 2 5 1 2
3 2 1 2 1
1 4 3 2 1
3 1 2 2 2
. . , ACM
5 11, 1962 .
558-562 doi: 10.1145/368996.369025