題解 建築物

2022-05-02 14:30:10 字數 3164 閱讀 5305

題目:

有r紅色立方體,g綠色立方體和b藍色立方體。每個立方體的邊長是1。現在有乙個n × n的木板,該板被劃分成1×1個單元。現在要把所有的r+g+b個立方體都放在木板上。立方體必須放置在單元格內,單元格可以豎立放置多個立方體。

放置在板上的立方體可以被視為「建築物」。乙個「建築物」被稱為「美麗建築物」,當且僅當:人站在南面,向北面望過去,觀察建築物時,所有可見立方體都是相同的顏色。

例如,在下圖中,左側建築物是「美麗建築物」,而右側建築物則不是。

問題是:給出r,g,b,n,有多少種不同的「美麗建築物」,答案模1000000007。

多組測試資料。

第一行,乙個整數group。表示有group組測試資料。1 <= group <= 8

每組測試資料格式:

一行,4個整數:r,g,b,n。  0<=r,g,b<26。 1 <= n <26。

題目大意:有紅、藍、綠三種顏色的正方體分別r,b,g個,放在乙個n × n的平面,高度不限,使得在乙個固定的方向看(在這裡我們簡單化為在前看),看見的所有格仔顏色相同!

題解:總體思路:

它有n行,我們可以化成小問題:第n行的放法由第n-1行推出:設第n-1行用了r1,b1,g1個紅、藍、綠方塊,第n行只能用r-r1,b-b1,g-g1個紅、藍、綠方塊,這時第n行的放法=第n-1行的放法*(r-r1,b-b1,g-g1個紅、藍、綠方塊在一列的放法)*這時需保證這一行的放法在前看的顏色與n-1行相同

這是近一步設陣列f[i][r][b][g],i為第i行、r,b,g為到這一行(包括這一行)用的紅、藍、黃的塊數(r<=r,b<=b,g<=g),g[r][b][g]:用r,b,g塊紅、藍、黃正方體放在一列的放法。可轉化為:f[i][r][b][g]=f[i-1][r1][b1][g1]*g[r-r1][b-b1][g-g1](r1<=r,b1<=b,g1<=g)*為保證當前行的放法在前看的顏色與前面的行相同,陣列f為在前面看顏色為r的放法數,陣列g為在前面看顏色為r的放法數!!!

結果為f[n][r][b][g]+f[n][b][r][g]+f[n][g][r][b](其中陣列後兩維可以調換)

接下來,就是求g陣列:

可以發現:求一列的方案數和之前的想法相似,設s[i][r][b][g] :為在某一列中到第i行,為到這一行(包括這一行)用的紅、藍、黃的塊數為r,b,g。

得s[i][r][b][g]=s[i-1][r-r1][b-b1][g-g1]+(b1+g1+r1)!/b1!/r1!/g1!(r1<=r,b1<=b,g1<=g),g[r][b][g]=s[n][r][b][g]

但是,我們發現,為這時如果b1+g1+r1大於之前的最高高度時,沒法保證露在外面的部分顏色為r。所以我們要在s陣列的基礎上多一維分別表示:限定的最高的高度。

同時動態轉移方程便變得分多種情況考慮:分r+b+g<=h、r+b+g>h

優化:上面的解法時間複雜度為o(25^8),遠遠超過五秒時限。造成這樣的原因,主要是因為列舉r,b,g,r1,b1,g1,為什麼我們不妨先把它們看做乙個同乙個整體(即同乙個顏色),先求出s陣列,但在求g陣列時因為我們把其看成了一種顏色,所以用組合數求出其方案數。

這時候我們需要把之前陣列s[h][n][z],h即最高高度,n即為到了第n行,z即為三總顏色塊數的總數。g[g][y]即放g個綠色的和y個紅或黃的在一列的放法。

但是在算某個方案的實際方案數時,需知道它的最高高度h,在總共n-h個,選r-h,r即可以放在前面的方塊的塊數。但因為我們在s陣列中不知道r,所以我們放在求g陣列時求,這是發現我們s陣列的漏洞:沒***在最高高度是多少?(即h是多少?)我們在原先的陣列中加多一維只有0,1來判斷在s[h][n][z]的是否到達最高位。這是求g陣列:g[g][y]+=s[h][n][g+y][1]*yhsj[g+y-h][g-h]*yhsj[y][r](yhsj[i][j]即楊輝三角,求組合數:i個中選j個的方案數)   但是r怎麼求?我們可以不考慮其,先把它等到f陣列時再考慮。

f陣列的定義改為:f[i][g][y]到第i行用分別g個綠、y個紅或藍的方案數,答案=f[n][g][r+b]*yhsj[r+b][r],這時可以發現原來r可是不需要列舉去求,可以直接在輸出時*yhsj[r+b][r]。

此時,f[i][g][y]+=f[i-1][g-g1][y-y1]*f[g1][y1]。

在最後算的時候,千萬別只輸出f[n][g][r+b]*yhsj[r+b][r](這僅僅只是綠色在前面的方案數),所以輸出f[n][b][r+g]*yhsj[r+g][r]+f[n][g][r+b]*yhsj[r+b][r]+f[n][r][g+b]*yhsj[g+b][g]!!!

最後附上**:

1 #include2 #include3

using

namespace

std;

4long

long group,rr,gg,bb,n,s[26][26][76][2],q[26][55],ans[26][26][55],mod=1000000007;5

long

long yhsj[76][76

],u;

6void

yhsj()718

}19}20

} 21

void find(long

long g,long

long r,long

long b,long

long

n)22

33 ans[0][0][0]=1;34

for (long

long i=1;i<=n;i++)

35for (long

long g=0;g<=g;g++)

36for (long

long y=0;y<=y;y++)

37for (long

long gg=0;gg<=g;gg++)

38for (long

long yy=0;yy<=y;yy++)

3942

43 u=(u+(ans[n][g][y]*yhsj[y][b]%mod))%mod;44}

45int

main()

4659

else

6064}65

}66 scanf("

%lld

",&group);

67for (long

long g=1;g<=group;g++)

6876

return0;

77 }

建築物牆面建模

通常我們要確定某個規則物體,可以提取相應的幾何特徵,例如乙個球只需提取出球心座標和半徑大小即可唯一確定該球。本次建模物件主要是某大學主樓,每次處理的物件是主樓的一部分,且每一部分可以近似看作矩形。最後將已處理的部分同時用pcd viewer release.exe工具顯示,並將處理後的結果與主樓原始...

rust建築物拆除指令 克拉瑪依拆除建築物

鴻運切割拆除工程 為您詳細解讀cmbtwh克拉瑪依拆除建築物的相關知識與詳情,陳某國的石油化學工業鼓起於20世紀60年代,目前擁有大中型石油化工企業100多個,幾乎遍及全國。那些企業每年為供給大量的石油賣得貨 合成纖維 塑料和化肥,以及一些根本化工本料,為陳某國國民經濟的迅速開展和餬口的改善做出了巨...

建築物的輪廓問題

問題描述 描述 對於城市中幾座建築外形,給出這些建築的二維輪廓。關於輸入 輸入的第一行是正整數 n 1 n 100 000 表示建築的數目。接下來 n 行,每行三個正整數start end height,表示建築的左邊界 右邊界和高度。關於輸出 輸出建築群的輪廓,包含多行,從左到右輸出建築的邊界 u...