藍橋杯 C++ b組 積木畫深度解析

題目大意:有兩種積木塊,I型和L型,給定一段2*N的畫布,問擺滿總共有多少種方式?

解法:狀態壓縮dp(強烈建議拿個筆跟著畫一下狀態,慢慢就懂了)

首先我們規定一下此題解中提到的狀態:
在第i列中會有兩格(因為2*N),0表示未被占,1表示被占了,即如果兩個格子都未被占則表示00,上面的未被占,下面的被占了表示01;同理10表示上面被占,下面未被占,11表示全都被占

另外,一旦發生狀態轉移,那么一定會讓當前的列被占滿!(為了防止重復情況,所以需要規定當前列占滿,也可以規定下一列占滿),這里看不懂先跳過,后面就看懂了

解題思路:
1.定義狀態數組f[i][j]:i表示當前的位置,j表示當前位置的狀態,f[i][j]表示在前i-1已經擺滿的前提下總共有多少中擺放方式

2.構建轉移數組g[j][k]:j表示轉移前的狀態,也就是當前(第i列)狀態;k表示轉移后i+1列的狀態
(1)對于轉移前第i列會有四種狀態即00,01,10,11(再次強調i-1列已經滿了,第i列可能被占是因為放i-1列的時候“不小心”占用了它,這也是為什么上面要規定發生狀態轉移,當前列被占滿)
(2)前提:一旦發生狀態轉移就要填滿第i列!那么如果當前列為00,我們便有四種擺放方式把它填滿,自己動手畫一下,加深理解!四種方式擺放完對應的i+1列也會有四種狀態,所以第i列擺放為00的時候,可以讓i+1出現00,01,10,11四種情況!后面的用下面的二維表格表示

00011011
001111
010011
100101
111000

由此也可得我們的轉移數組g[4][4],而00,01,10,11在二進制轉十進制中剛好對應0123

3.狀態轉移公式:f[i+1][k]+=f[i][j]*g[j][k],首先理清這里面的i,j,k都是什么。f[i+1][k]就已經是下一個狀態了,即第i列擺滿,且i+1列的狀態為k。而后面的f[i][j]*g[j][k],即f[i][j]想變成f[i+1][k],就必須滿足g[][]!=0才行,因為g[][]=1才表示可以轉移到f[i+1][k]狀態啊!

4.關于狀態數組的初始化,f[1][0]=1,我們一開始放的時候其實就相當于第0列以及被鋪滿,且第1列一個沒放;初始化為1,這個地方我是通過自己推到前幾項得來的!

5.循環:首先是列數的循環,第i列的時候,我們得到的是i+1,而初始化為1,所以我們遍歷為1~n;其次就是每一列可能出現的四種狀態j和四種擺放方式k的循環

下面的代碼里面也有解釋,如果還不懂就結合代碼來看或許會簡單不少QWQ

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N = 1e7+5;
const int MOD = 1e9+7;int n;
int g[4][4]={{1,1,1,1},{0,0,1,1},{0,1,0,1},{1,0,0,0},
};//g[當前狀態][轉移狀態]
//轉移狀態:在i放滿的前提下i+1的狀態int f[N][4];//狀態轉移數組
//f[i][j]表示前i-1已經放滿,j表示第i列狀態,00,01,10,11分別對應0,1,2,3
//f[i][j]的值就是到此時的個數              int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;f[1][0]=1;//初始化初始狀態,下一個狀態是對第一列進行擺放,相當于第0列全部占滿了for(int i=1;i<=n;i++)//1~n的狀態對應初始狀態~最終的前一個狀態{for(int j=0;j<4;j++)//遍歷四種第i列的四種狀態,即00,01,10,11{for(int k=0;k<4;k++)//遍歷狀態轉移{f[i+1][k]=(f[i+1][k]+f[i][j]*g[j][k])%MOD;}}}cout<<f[n+1][0];//n列放滿,且n+1列當前狀態為00,即什么也不放return 0;
}

另外還是有些優化的
1.滾動數組優化:我寫到下面的代碼里面吧,這樣更直觀!
2.乘法相比于加減更耗時間,我們可以在進行狀態轉移的時候,可以先判斷g[][]是否為1,詳見代碼吧!
?

#include<bits/stdc++.h>
using namespace std;
using ll=long long;const int N = 1e7+5;
const int MOD = 1e9+7;int n;
int g[4][4]={{1,1,1,1},{0,0,1,1},{0,1,0,1},{1,0,0,0},
};
//優化為滾動數組
//1.將初始的f[N][4]改為f[2][4]
//2.將所有的f[這個位置&1][]即可
//3,記得每一輪狀態轉移開始前,將下一個狀態對應的數組元素初始化為0
int f[2][4];             int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;f[1][0]=1;for(int i=1;i<=n;i++){memset(f[i+1&1],0,sizeof f[0]);// 將下一個狀態對應的數組元素初始化為 0// (i + 1) & 1 確定要操作的是 f[0] 還是 f[1]// sizeof f[0] 表示要初始化的字節數for(int j=0;j<4;j++){for(int k=0;k<4;k++){if(g[j][k])//判斷是否為1,為1進行下面的狀態轉移f[i+1&1][k]=(f[i+1&1][k]+f[i&1][j])%MOD;}}}cout<<f[n+1&1][0];return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71782.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序事件系統 —— 32 事件系統 - 事件分類以及阻止事件冒泡

在微信小程序中&#xff0c;事件分為 冒泡事件 和 非冒泡事件 &#xff1a; 冒泡事件&#xff1a;當一個組件的事件被觸發后&#xff0c;該事件會向父節點傳遞&#xff1b;&#xff08;如果父節點中也綁定了一個事件&#xff0c;父節點事件也會被觸發&#xff0c;也就是說子組…

【從0到1搞懂大模型】神經網絡的實現:數據策略、模型調優與評估體系(3)

一、數據集的劃分 &#xff08;1&#xff09;按一定比例劃分為訓練集和測試集 我們通常取8-2、7-3、6-4、5-5比例切分&#xff0c;直接將數據隨機劃分為訓練集和測試集&#xff0c;然后使用訓練集來生成模型&#xff0c;再用測試集來測試模型的正確率和誤差&#xff0c;以驗證…

Django與數據庫

我叫補三補四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講alpha策略制定后的測試問題 mysql配置 Django模型體現了面向對象的編程技術&#xff0c;是一種面向對象的編程語言和不兼容類型能相互轉化的編程技術&#xff0c;這種技術也叫ORM&#…

從 GitHub 批量下載項目各版本的方法

一、腳本功能概述 這個 Python 腳本的主要功能是從 GitHub 上下載指定項目的各個發布版本的壓縮包&#xff08;.zip 和 .tar.gz 格式&#xff09;。用戶需要提供兩個參數&#xff1a;一個是包含項目信息的 CSV 文件&#xff0c;另一個是用于保存下載版本信息的 CSV 文件。腳本…

ECC升級到S/4 HANA的功能差異 物料、采購、庫存管理對比指南

ECC升級到S/4 HANA后&#xff0c;S4 將數據庫更換為HANA后性能有一定提升&#xff0c;對于自開發程序&#xff0c;可以同時將計算和部分業務邏輯下推到HANA數據庫層&#xff0c;減少應用層和數據庫層的交互次數和數據傳輸&#xff0c;只返回需要的結果到應用層和顯示層。提升自…

表格columns拼接兩個后端返回的字段(以umi框架為例)

在用組件對前端項目進行開發時&#xff0c;我們會遇到以下情況&#xff1a;項目原型中有取值范圍這個表字段&#xff0c;需要存放最小取值到最大取值。 而后端返回給我們的數據是返回了一個最小值和一個最大值&#xff0c; 在columns中我們需要對這兩個字段進行拼接&#xff0…

使用Galaxy創建生物信息學工作流的步驟詳解

李升偉 整理 Galaxy 是一個基于 Web 的生物信息學平臺&#xff0c;提供了直觀的用戶界面和豐富的工具&#xff0c;幫助用戶創建和管理生物信息學工作流。以下是使用 Galaxy 創建生物信息學工作流的主要步驟&#xff1a; 1. 訪問 Galaxy 平臺 打開 Galaxy 的官方網站&#xff…

藍橋杯—走迷宮(BFS算法)

題目描述 給定一個NM 的網格迷宮 G。G 的每個格子要么是道路&#xff0c;要么是障礙物&#xff08;道路用 11表示&#xff0c;障礙物用 0 表示&#xff09;。 已知迷宮的入口位置為 (x1?,y1?)&#xff0c;出口位置為 (x2?,y2?)。問從入口走到出口&#xff0c;最少要走多少…

【GPT入門】第12課 FunctionCall 生成數據庫sql代碼

【GPT入門】第12課 FunctionCall 生成數據庫sql代碼 1.概述2. 代碼3.執行結果 1.概述 如下代碼的任務&#xff1a;自然語言問ai,自動生成sql并回答用戶 實現思路&#xff1a; 步驟1. ai會把用戶的問題&#xff0c;轉為sql 步驟2. 程序執行sql 步驟3.把執行的sql結果&#xff…

《白帽子講 Web 安全》之身份認證

目錄 引言 一、概述 二、密碼安全性 三、認證方式 &#xff08;一&#xff09;HTTP 認證 &#xff08;二&#xff09;表單登錄 &#xff08;三&#xff09;客戶端證書 &#xff08;四&#xff09;一次性密碼&#xff08;OTP&#xff09; &#xff08;五&#xff09;多因…

服務器python項目部署

角色&#xff1a;root, 其他用戶應該也可以 1. 安裝python3環境 #如果是新機器&#xff0c;盡量執行&#xff0c;避免未知報錯 yum -y update python -v yum install python3 python3 -v2. 使用virtualenvwrapper 創建虛擬環境,并使用workon切換不同的虛擬環境 # 安裝virtua…

更新vscode ,將c++11更新到c++20

要在CentOS系統中安裝最新版本的GCC&#xff0c;你可以使用SCL&#xff08;Software Collections&#xff09;倉庫&#xff0c;它提供了開發工具的最新版本。以下是安裝步驟&#xff1a; 1、 添加SCL倉庫&#xff1a; 首先&#xff0c;添加CentOS的SCL倉庫&#xff0c;該倉庫…

Deeplabv3+改進5:在主干網絡中添加EMAattention|助力漲點!

??【DeepLabv3+改進專欄!探索語義分割新高度】 ?? 你是否在為圖像分割的精度與效率發愁? ?? 本專欄重磅推出: ? 獨家改進策略:融合注意力機制、輕量化設計與多尺度優化 ? 即插即用模塊:ASPP+升級、解碼器 PS:訂閱專欄提供完整代碼 目錄 論文簡介 步驟一 步驟二…

基于自監督三維語義表示學習的視覺語言導航

前言 目前的視覺語言導航存在的問題&#xff1a; &#xff08;1&#xff09;在VLN任務中&#xff0c;大多數當前方法主要利用RGB圖像&#xff0c;忽略了環境固有的豐富三維語義數據。許多語義無關的紋理細節不可避免地被引入到訓練過程中&#xff0c;導致模型出現過擬合問題&…

網絡原理之HTTPS(如果想知道網絡原理中有關HTTPS的知識,那么只看這一篇就足夠了!)

前言&#xff1a;隨著互聯網安全問題日益嚴重&#xff0c;HTTPS已成為保障數據傳輸安全的標準協議&#xff0c;通過加密技術和身份驗證&#xff0c;HTTPS有效防止數據竊取、篡改和中間人攻擊&#xff0c;確保通信雙方的安全和信任。 ???這里是秋刀魚不做夢的BLOG ???想要…

【江協科技STM32】ADC數模轉換器-學習筆記

ADC簡介 ADC&#xff08;Analog-Digital Converter&#xff09;模擬-數字轉換器ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁&#xff0c;ADC是一種將連續的模擬信號轉換為離散的數字信號的設備或模塊12位逐次逼近型…

文件系統文件管理

文件緩沖區&#xff08;內核級&#xff0c;OS內部的&#xff09;存在的意義&#xff1a;系統調用將數據寫入緩沖區后函數即可返回&#xff0c;是從內存到內存的&#xff0c;提高了程序的效率。之后將緩沖區數據刷新到硬盤則是操作系統的事了。無論讀寫&#xff0c;OS都會把數據…

HTML 標簽語義化指南:讓網頁更易讀

HTML 語義化標簽是指在 HTML 中使用具有明確含義的標簽來標記網頁內容的結構和意義。這些標簽可以提供更多的語義信息&#xff0c;有助于搜索引擎理解網頁內容&#xff0c;并為使用輔助技術的用戶提供更好的訪問體驗。 以下是一些常見的HTML語義化標簽及其含義和用途&#xff…

機器學習:線性回歸,梯度下降,多元線性回歸

線性回歸模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的數學公式 多元線性回歸&#xff08;Multiple Linear Regression&#xff09;

共繪智慧升級,看永洪科技助力由由集團起航智慧征途

在數字化洪流洶涌澎湃的當下&#xff0c;企業如何乘風破浪&#xff0c;把握轉型升級的黃金機遇&#xff0c;已成為所有企業必須直面的時代命題。由由集團&#xff0c;作為房地產的領航者&#xff0c;始終以前瞻視野引領變革&#xff0c;堅決擁抱數字化浪潮&#xff0c;攜手數字…