題目:
有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 #include3using
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...