ZJU-1074

这道题穷举的复杂度是O(n^6),超时,所以不得不改进。
加了一个二维数组v,在处理每一个点的时候使用,存储包括该点上数据左上角的子矩阵值的和
v[i][j] = s[i][j] + v[i-1][j] + v[i][j-1] - v[i-1][j-1];
重点在这一句用容斥原理,减少了点计算量

这样子下来复杂度就是O(n^4),还是挺复杂,虽然很不满意这个结果,但是至少AC了,有空再改进

//2007-12-31 20:19:38 Accepted 1074 C++ 00:00.19 472K #include<stdio.h> int n; int s[101][101]; int v[101][101]; int getasubmax(int s[101][101],int q, int p) { int i,j,t; v[q][p] = s[q][p]; int submax=v[q][p]; for(i=p+1;i<n;i++) { v[q][i] = s[q][i] + v[q][i-1]; if(v[q][i]>submax) submax=v[q][i]; } for(i=q+1;i<n;i++) { v[i][p] = s[i][p] + v[i-1][p]; if(v[q][i]>submax) submax=v[i][p]; } for(i=q+1;i<n;i++) { for(j=p+1;j<n;j++) { v[i][j] = s[i][j] + v[i-1][j] + v[i][j-1] - v[i-1][j-1]; if(v[i][j] > submax) submax = v[i][j]; } } return submax; } int main() { //freopen("1074.txt","r",stdin); int i,j,totmax=0,t; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&s[i][j]); } for(i=0;i<n;i++) { for(j=0;j<n;j++) { t = getasubmax(s,i,j); if(t>totmax) totmax = t; } } printf("%d/n",totmax); //fclose(stdin); return 0; } 

你可能感兴趣的:(ZJU-1074)