لینک‌های مفید برای شرکت در مسابقه:

توجه کنید که سوالات مسابقه ترتیب خاصی ندارند.

می‌توانید سوالات خود را از قسمت "سوال بپرسید" مطرح کنید.

F: Trays



André Claude Marzipan is the head chef at the French restaurant Le Chaud Chien. He owns a vast number of baking trays, which come in two sizes: 11 foot by 11 foot, and 11 foot by 22 feet. He stores them along 33-foot deep shelves of various lengths. For example, on a shelf that is 55 feet long, he might store baking trays in either of the two ways shown below:

Figure G.1

Of course, there are many more than just these two ways, and in his off hours André often wonders how many different ways he can place trays on a given shelf. André is a bit of un maniaque du rangement (neat freak), so he insists that the trays are always aligned along the two axes defined by the shelf edges, that the edges of the trays are always 11 foot multiples away from any edge, and that no portion of a tray extends beyond the shelf. The matter is complicated by the fact that often there are locations on the shelf where he does not want to put any baking trays, due to leaks above the shelf, dents in the shelf’s surface, etc. Since André is more adept at cuisine than counting, he needs a little help.

Input🔗

The input consists of two lines: the first line will contain two integers m,nm, n, where 1m241 \le m \le 24 indicates the length of the shelf (which is always 33-feet deep) and nn indicates the number of bad locations on the shelf. The next line will contain nn coordinate pairs xyx y indicating the locations where trays should not be placed, where 0<x<m0 < x < m and 0<y<30 < y < 3. No location will have integer coordinates and coordinates are specified to the nearest hundredth. If n=0n = 0, this second line will be blank.

Output🔗

Output the number of ways that trays could be placed on the shelf.

Sample Input 1🔗

4 0
Plain text

Sample Output 1🔗

823
Plain text

Sample Input 2🔗

4 2
0.29 2.44 2.73 1.8
Plain text

Sample Output 2🔗

149
Plain text

راهنمایی ۱

ابتدا فرض کنید مکان بد نداریم و سینی‌ها را در همه‌جای جدول 3m3 * m (همان تاقچه‌ی گفته شده در مسئله)‌ می‌توان قرار داد.

حال فرض کنید می‌خواهیم از چپ به راست حرکت کنیم و با استفاده از برنامه‌نویسی پویا، مقدار فعلی مورد نظر را از مقادیر قبلی به دست آوریم. بدین منظور dp[i]dp[i] را تعریف می‌کنیم، تعداد روش‌های گذاشتن سینی‌ها در یک جدول 3i3 * i. با اندکی تفکر در می‌یابیم که رابطه‌ی بازگشتی که این dpdp را اپدیت می‌کند،‌ خیلی سخت و طولانی است و بنابراین می‌توان نتیجه گرفت که راه مناسبی برای حل مسئله نیست.

پس چه کنیم ؟!!!

برای اینکه dpdp ما از مقادیر قبلی قابل اپدیت شدن باشد،‌ میاییم به آن یک بعد اضافه می‌کنیم که بعد جدید نشان‌دهنده‌ی وضعیت دو ستون آخر می‌باشد که آیا ۶ خانه‌ی این دو ستون تاکنون پر شده‌اند یا نه. حال می‌توانیم با گذاشتن یک دومینو به وضعیت جدیدی برویم و مقدار آن وضعیت جدید را از مقدار خود اپدیت کنیم.

حال کمی تعریف را دقیق کنیم. dp[i][mask]dp[i][mask] را تعریف می‌کنیم تعداد روش‌های گذاشتن سینی در ii ستون اول به طوری که ستون‌های ‍۱ تا i2i - 2 به صورت کامل با سینی پر شده باشند و maskmask هم نشان‌دهنده‌ی وضعیت دو ستون آخر باشد. توجه داشته باشید که maskmask عددی از ۰ تا ۶۳ است که اگر آن را به چشم یک عدد ۶ بیتی در مبنای دو نگاه کنیم، بیت‌های آن نشان‌دهنده‌ی وضعیت دو ستون آخر ما هستند. علت اینکه maskmask را وضعیت دو ستون آخر گرفتیم این بود که ما اکنون می‌خواهیم سینی‌هایی را قرار دهیم که حتما در ستون ii ام خانه‌ای را اشغال می‌کنند و به وضوح این سینی‌ها با ستون‌های ۱ تا i2i - 2 اشتراکی ندارند.


راهنمایی ۲

اکنون فرض کن خانه‌های بد نیز وجود دارند و ما نمی‌توانیم داخل این خانه‌ها سینی قرار دهیم. تنها تفاوتی که این مسئله با حالت قبل دارد، این است که ما هیچ‌گاه dp[i][mask]dp[i][mask]هایی که در maskmask وضعیت یک خانه‌ی بد خالی نشان داده‌ می‌شود را اپدیت نمی‌کنیم. در واقع می‌توانیم فرض کنیم که خانه‌های بد از ابتدا پر بوده‌اند و لذا مقدار تعدادی از استیت‌های dpdp برابر صفر خواهند شد. این تنها تفاوت این قسمت و حالت قبل است.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.