題意
思路:DP.
一開始我用二維樹狀數組去搞。死在最優一組數據上(全1)。因為那樣有很多浪費的操作。可是想不出什么好辦法,無奈問了好多人。diy群的神牛們一致說dp,baihacker大神的做法好像就這樣的.水平太弱,聽不懂。后來還是在一個朋友的指點下領悟了dp的思想。具體如下
設dp[i][j] 為以(i,j)為左上角的符合情況的邊的最大長度。那么我們可以得到長度為k的方陣的個數等于那些dp[i][j]>=k的個數。
用樣例來說的話
  dp[i][j]如下
  1 0 4 2 3 1
  0 0 3 3 2 1
  1 1 2 2 2 1
  0 0 2 1 1 1
  0 0 1 1 0 1
  1 1 1 0 0 1
  那么2的個數就是dp[i][j] >= 2的數目也就是6(2的個數)+3(3的個數)+1(4的個數)=10
  3和4同理
  那么現在要求的就是所有dp[i][j]了。我們可以得到如下轉移方程。
  if(0 == num[i][j])/*num存的是原矩陣*/
   dp[i][j] = 0;/*矩陣含0不符合情況*/
 else
  dp[i][j] = min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1;
 到這里基結束了。官方的有兩種做法,也都是dp。第一種是n^3的,這里就不說了。第二種是n^2的。而且空間也比較小,這里貼下。
官方