【題解】最大ゼロ行列
ソース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の問題は少し違っています。
考えてみましたが、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<