和我之前做的那个切西瓜的题目相比就是小巫见大巫了。。
运用最长字段和的原理把O(n^4)转化成O(n^3)
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int maxx; int num[101]; int map[101][101]; int top; void dos() { int ns,i; ns=0; for(i=0;i<top;i++) { ns+=num[i]; if(ns<0)ns=0; maxx=max(maxx,ns); } } int main() { int i,j,n,x,k; while(~scanf("%d",&n)) { memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&x); map[i][j]=map[i][j-1]+x; } } for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { top=0; for(k=1;k<=n;k++) { num[top++]=map[k][i]-map[k][j-1]; } dos(); } } cout<<maxx<<endl; } return 0; }