动态规划+最小堆排序 最小堆空间的分配 判断句的嵌套 和&&注意了 #include<stdio.h> int a[101][101]; int b[101][101]; int dui[10001][3]; int x,y; int r,c; int sizenum=0; int dele(); void adjust(int i); void insert(int a1,int a2,int a3); int f(int n); int main() { scanf("%d%d",&r,&c); int i,j;int max=0; for(i=1;i<=r;i++) for(j=1;j<=c;j++) { scanf("%d",&a[i][j]); insert(i,j,a[i][j]); } f(r*c); for(i=1;i<=r;i++){ for(j=1;j<=c;j++) { if(max<b[i][j])max=b[i][j]; } } printf("%d",max); return 0; } int dele() { int k=1; x=dui[k][0]; y=dui[k][1]; dui[k][0]=dui[sizenum][0]; dui[k][1]=dui[sizenum][1]; dui[k][2]=dui[sizenum][2]; sizenum--; adjust(k); return 0; } void adjust(int i) { int k=i;int m;int n; int val; if(2*k+1<=sizenum) { if(dui[2*k][2]>=dui[2*k+1][2]) { if(dui[2*k+1][2]<dui[k][2]) { m=dui[k][0],n=dui[k][1]; val=dui[k][2]; dui[k][0]=dui[2*k+1][0],dui[k][1]=dui[2*k+1][1]; dui[k][2]=dui[2*k+1][2]; dui[2*k+1][0]=m,dui[2*k+1][1]=n; dui[2*k+1][2]=val; adjust(2*k+1); } } else { if(dui[2*k][2]<dui[k][2]) { m=dui[k][0],n=dui[k][1]; val=dui[k][2]; dui[k][0]=dui[2*k][0],dui[k][1]=dui[2*k][1]; dui[k][2]=dui[2*k][2]; dui[2*k][0]=m,dui[2*k][1]=n; dui[2*k][2]=val; adjust(2*k); } } } if(2*k==sizenum) { if(dui[2*k][2]<dui[k][2]) { m=dui[k][0],n=dui[k][1]; val=dui[k][2]; dui[k][0]=dui[2*k][0],dui[k][1]=dui[2*k][1]; dui[k][2]=dui[2*k][2]; dui[2*k][0]=m,dui[2*k][1]=n; dui[2*k][2]=val; adjust(2*k); } } } void insert(int a0,int a1,int a2) { sizenum++; dui[sizenum][0]=a0; dui[sizenum][1]=a1; dui[sizenum][2]=a2; int k=sizenum; while(k/2>0&&dui[k/2][2]>dui[k][2]) { int m;int n; int val; m=dui[k/2][0],n=dui[k/2][1]; val=dui[k/2][2]; dui[k/2][0]=dui[k][0],dui[k/2][1]=dui[k][1]; dui[k/2][2]=dui[k][2]; dui[k][0]=m,dui[k][1]=n; dui[k][2]=val; k/=2; } } int f(int n) { while(n--) { int i,j,val; int max=0; dele(); i=x;j=y;val=a[i][j]; if(i!=1) if(a[i-1][j]<val&&max<(1+b[i-1][j]))max=1+b[i-1][j]; if(i!=r) if(a[i+1][j]<val&&max<(1+b[i+1][j]))max=1+b[i+1][j]; if(j!=1) if(a[i][j-1]<val&&max<(1+b[i][j-1]))max=1+b[i][j-1]; if(j!=c) if(a[i][j+1]<val&&max<(1+b[i][j+1]))max=1+b[i][j+1]; if(max==0)max=1; b[i][j]=max; } return 0; }