[[藍橋杯][2023年第九屆真題]搭積木](
小明對搭積木非常感興趣。他的積木都是同樣大小的正立方體。
在搭積木時,小明選取 m 塊積木作為地基,將他們在桌子上一字排開,中間不留空隙,並稱其為第0層。
隨後,小明可以在上面擺放第1層,第2層,……,最多擺放至第n層。擺放積木必須遵循三條規則:
其中,小明不喜歡的位置都被標在了圖紙上。圖紙共有n行,從下至上的每一行分別對應積木的第1層至第n層。每一行都有m個字元,字元可能是『.』或『x』,其中『x』表示這個位置是小明不喜歡的。
現在,小明想要知道,共有多少種放置積木的方案。他找到了參加藍橋杯的你來幫他計算這個答案。
由於這個答案可能很大,你只需要回答這個答案對1000000007(十億零七)取模後的結果。
注意:地基上什麼都不放,也算作是方案之一種。
參考部落格
dp我們用到兩個函式:
check[i][j]:表示第i層前j個中有多少個『x』
dp[l][r] = v:表示當前層中的[l,r]的方法數是v
check其實就是字首和操作,對每一層進行字首和運算
我們規定積木從下到上分別是第n層,第n-1層,最上面是第一層
我們首先用check來更新最低層dp的值
然後從最低層開始向上傳遞,即從大區間列舉到小區間後得出的方法數
轉移方程是:
dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1]
因為我們的l和r分別是從兩端開始向內走,所以我們更新區間[時也是由外向內更新,當更新區間[l,r]時,我們已經的值[區間l-1][r]和區間[l][r+1]區間[l-1][r+1],因為dp[l-1][r]和dp[l][r+1]中包括的是[l-1,r+1]+[l,r]所以要減去
這樣的前提是[l,r]中沒有x,因為除了最低層,其他層塊的建立必須在下層的基礎上建成且必須連續,不能有空中樓閣。
如果有x,則dp[l][r] = 0
不好理解u1s1,慢慢悟一悟
反正就是,先求出最低層,然後依次向上,求出列舉每一塊區間,記錄答案
#include
using
namespace std;
#define mod 1000000007
typedef
long
long ll;
const
int maxn =
110;
ll dp[maxn]
[maxn]
;///dp[l][r]=v記錄的是當前層中的[l,r]的方法數為v(初始dp是dp[n][l][r])
///轉移為dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1](因為dp[l-1][r]和dp[l][r+1]中包括的是[l-1,r+1]+[l,r]所以要減去)
///由題意可知初始化為第n層的方法數,即從大區間列舉到小區間後得出的方法數
///轉移時若[l,r]中沒有x,則方法數為dp[l][r]+=dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1],相當於向上傳遞,反之從這一層開始[l,r]區間的方法數就為0
int check[maxn]
[maxn]
;int
main()
}}ll ans=1;
///沒有放也是一種
for(
int i=
1;i<=m;i++)}
}for
(int t=n-
1;t>
0;t--
)else}}
}printf
("%lld\n"
,ans)
;return0;
}
藍橋杯 2023年第九屆真題 全球變暖
你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...
藍橋杯 2023年第九屆真題 防禦力
還有兩題放在最後寫,不是說它難,而是它有問題。基本可以確定防禦力是錯了,答案沒有按照字典序排序。然後去知乎翻了一波往年的評價,發現那次比賽有三次勘誤,可能包括這個 因為也沒有人提到 採油這題無意中發現有人說了做法,但是其實是有缺陷的,雖然可以過藍橋杯的資料,但是構造了一組樣例把它hack了。所以可能...
藍橋杯 2023年第九屆真題 全球變暖 廣搜
你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...