【題解】最大ゼロ行列


ソースhttp://codevs.cn/problem/1159/ 去年のAPUCの概論試験のH問題はここから式が変わってきました。その時にO(n^4)の実際n^6の列挙を書きましたが、もちろんありませんでした。当時A=希望があれば、srz神犇を試験し終わったら教えてくださいました。O(n^3)のアルゴリズムは聞き取れませんでした。だらだらとしていましたが、今日になってやっと研究してみました。ある省のおじいさんが論文を書いていたので、とても詳しいです。http://wenku.baidu.com/link?url=BmVcU3ZfKTabjcsNzYHeOkYoHHCU1EnbGu4JKclaORpNcxxubAr0j9y-aYIL 8 uCwgyCAFC 19 SUDTnuDHEZLIG 6 VrmSL 7 mbS 4 zKvuG 3 jG
考えてみましたが、n^3のアルゴリズムは明らかにできますが、論文の中の法6は私に深い印象を残しています。時間を割いて必ず実現してください。
自分で書いたのは法3ですよね。srz大神さんの方法は、簡単で効果的です。特に二次元を一次元に変換する方法と部分とO(1)を実現する判断は、示唆が大きいです。
実は多くの問題はそんなに難しくありません。この典型的な水問題は私に深く説明されました。
次の3のACコードです。元の問題とHの問題は少し違っています。
#include
#include
#include
#include
#include
#include
using namespace std;

int f[2050][2050],ans,n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
     {
        int b=0,x=0;
        for(int j=1;j<=n;j++)
         {
            cin>>x;
            if(!x)
            {
                b++;
                f[i][j]=b;
            }
            else b=0;
         }
     }

    for(int i=1;i<=n;i++)
     {
        for(int j=1;j<=n;j++)
         {  if(!f[i][j])
          continue;
            int p=i,q=i;
            while((p>1&&f[p][j])&&f[p-1][j]>=f[i][j])
            {
                p--;
            }
            while((q1][j]>=f[i][j])
            {
                q++;
            }
            ans=max(ans,(q-p+1)*f[i][j]);
         }
     } 
     cout<