intさわだんのBlack History

刹那的レジェンドになりたい。

POJ(PKU) 1050 To the Max

解法:ナイーブな実装.O(N^4).

O(N^4)になるのでダメ、といっているものを拝見しましたが、実はO(N^4)でいけます。(ちょっと工夫が必要だけど

累積和を二次元にするだけです。
難しく考えすぎるとかえってダメな場合もありますね、、、。

#include <cstdio>
#include <algorithm>

using namespace std;

int main(){
  
  int n,k[102][102]={0},ans = -100000000;
  
  scanf("%d",&n);
  
  for(int i = 1;i <= n;i++){
    for(int j = 1;j <= n;j++){
      int tmp;
      scanf("%d",&tmp);
      k[i][j] = k[i][j-1] + k[i-1][j] - k[i-1][j-1] + tmp;
    }
  }
  
  for(int i = 1;i <= n;i++){
    for(int j = i;j <= n;j++){
      for(int l = 1;l <= n;l++){
	for(int m = l;m <= n;m++){
	  ans = max(ans,k[m][j]-k[l-1][j]-k[m][i-1]+k[l-1][i-1]);
	}
      }
    }
  }
  
  printf("%d\n",ans);
  
  return 0;
}