題解 AOJ 0525 Osenbei 搜尋

2021-10-05 20:11:16 字數 1471 閱讀 7600

ioi製果公司用創業以來的傳統制法煎製煎餅。這種傳統制法是用炭火在一定時間內烤正面,正面烤後翻轉,用炭火在一定時間內烤背面。保持著這個傳統,用機器煎煎餅。該機器將煎餅排成縱r(1≤r≤10)行、橫c(1≤c≤10000)列的長方形來烤。通常是自動駕駛,正面烤好後一齊把煎餅翻過來背面烤。有一天,煎煎餅的時候,在翻煎餅之前發生了**,幾張煎餅都翻了。幸運的是,炭火的狀態還保持在適當的狀態,但如果再燒到正面,就會超過創業以來的傳統規定的燒時間,煎餅的正面會被燒得太久,無法作為商品上市。於是,他趕緊把機器改為手動操作,只把還沒有翻過來的煎餅翻過來。這台機器,可以同時翻過來幾行橫的,同時翻過來幾列豎的,可惜的是,煎餅一張一張地翻不過來。取的,需要時間和**中沒有裡返ら煎餅的間前面太燒作為商品無法發貨,所以旁邊的幾行,同時一次翻過來,繼續,縱向的幾排翻過來,同時一次間前面不太烤兩面可以烤煎餅,也就是說,「可以出貨煎餅」決定盡可能多的數量。也考慮橫的行一行也不翻轉,或者縱的列一列也不翻轉的情況。請寫下輸出能出貨的煎餅張數最大值的程式。**之後,煎餅就變成了下面這個樣子。黑色圓圈表示正面燒製的狀態,白色圓圈表示背面燒製的狀態。(用的翻譯軟體,大概意思理解就好)

注意,r的上限10小於c的上限10000。

輸入由多個資料集組成。每個資料集以以下形式給出:在輸入的第一行中,以空白為間隔寫有兩個整數r、c(1≤r≤10,1≤c≤10 000)。接著的r行表示**後的煎餅狀態。第(i+1)行(1≤i≤r)有c個整數ai,1, ai,2,……, ai,c以空白為間隔寫,ai,j表示i行j列的煎餅狀態。ai,j為1表示正面燒製,0表示背面燒製。當c和r均為0時,指示輸入結束,資料集的數目不超過5。

每個輸出資料集輸出1行可發貨的煎餅的最大張數。

思路:因為行數最多只有10行,所以先確定行再判斷列,行的話最多是210種可能,然後每種可能再去判斷列,使得列中的1數量最多。具體細節看**注釋。

#include

using

namespace std;

int r, c;

int arr[15]

[10005];

int ans;

void

dfs(

int t)

ans =

max(ans, sum)

;//ans是最終值,如果sum比ans大就替代

return;}

dfs(t +1)

;//第t行不反轉,進入下一行

for(

int i =

0; i < c; i++

)//反轉當前行

arr[t]

[i]=

!arr[t]

[i];

dfs(t +1)

;//反轉後進入的下一行

}int

main()

return0;

}

JL 05 字串題解

jl 05 字串題解 原題 字串 描述現在有乙個長度為 n 的字串,它的字典集為 m 也就是說每一位有 m 種不同的字母可以選。對於這個字串所有連續的長度為 k 的子串都必 須是回文串,請問有多少種不同的方案。由於答案可能很大,請將答案 mod 1e9 7 輸入一共一行,三個整數表示 n,m,k n...