题意
思路: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的。而且空间也比较小,这里贴下。
官方