You are not allowed to perform this action

سوال ۲

منظور از یک زیر جدول در یک جدول، جدولی است که از خانه‌های واقع در تقاطع تعدادی سطر متوالی و تعدادی ستون متوالی از جدول ساخته می‌شود. در ورودی، جدولی $n×n$ با اعداد متمایز به شما داده می‌شود. هدف، یافتن عددی در جدول است که در بیش ترین تعداد زیرجدول، عدد بیشینه باشد. الگوریتمی از $O(n^3)$ برای این کار ارائه دهید.

نکته: در صورتی که نتوانستید سوال را به صورت کامل حل کنید، می‌توانید با ارائه‌ی الگوریتم از $O(n^{3.99})$ تا ۵۰ امتیاز یا با ارائه‌ی الگوریتم از $O(n^4)$ تا ۱۵ امتیاز بگیرید.

راهنمایی

برای هر خانه، بشمارید در چند زیرمستطیل مقدار بیشینه است

راهنمایی

فرض کنید این کار را برای تمام زیرمستطیل‌هایی بخواهیم انجام دهیم که دقیقا از سطر $top$ تا سطر $bottom$ را شامل شود. این سوال را در $O(n)$ حل کنید.

راهنمایی

خانه‌ی سطر $i$ و ستون $j$ جدول را با $A[i][j]$ نمایش می‌دهیم. برای هر $1 \le j \le m$ تعریف کنید $$ M[j] = \max_{\text{top} \le i \le \text{bottom}} A[i][j] $$

راهنمایی

دقت کنید فقط خانه‌هایی که در مقادیر آرایه‌ی $M$ تاثیر داشته‌اند برای مستطیل‌های مورد نظر تاثیرگذارند. پس مسئله را می‌توان به صورت آرایه‌ای یک بعدی دید.

راهنمایی

برای حل سوال راهنمایی بالا، از تکنیک monotonic-stack (نزدیک‌ترین عنصر بزرگ‌تر، از چپ و راست) استفاده کنید.

راهنمایی

قرار می‌دهیم $L[j]$ نزدیک‌ترین عنصر از سمت چپ به عنصر $j$ ام که $M[L[j]] > M[j]$، و در صورتی که چنین جایگاهی وجود نداشت آن را صفر می‌گذاریم. به طور مشابه $R[j]$ را نزدیک‌ترین عنصر از سمت راست به عنصر $j$ ام که $M[R[j]] > M[j]$ قرار می‌دهیم. حال می‌توانیم تعداد بازه‌هایی که عنصر $M[j]$ در آن‌ها بیشینه است را حساب کنیم.

راهنمایی

سعی کنید آرایه‌ی $M$ را حین محاسبات بالا انجام دهید تا تاثیر مخربی بر تحلیل زمانی برنامه نگذارد.

راهنمایی

همچنین $pos[j]$ را همراه $M[j]$ حساب می‌کنیم، که نگه‌دارد $M[j]$ مقدار خانه‌ی کدام سطر از ستون $j$ است.