立方體塔 頭條筆記題 dp,揹包算方案數

2021-09-25 10:33:54 字數 1325 閱讀 5657

題目鏈結;

題目:

方有w個白色立方體和b個黑色立方體,現在小方想把它們堆成乙個立方體塔。

一座高度為h的立方體塔,最底層有h個立方體,每往上一層,所需立方體減一,直到最高層只需要乙個立方體。

為了讓這座塔看起來美觀,小方希望,每一層都只能用一種顏色的立方體。

小方希望把這座塔疊的盡可能高,因此他想知道塔的最大高度是多少,以及這個高度的立方體塔能有幾種。

兩種立方體塔,當且僅當至少有一層的顏色是不同的,則被認為是不同的。

輸入格式

共一行,包含兩個整數w和b。

輸出格式

共一行,包含兩個整數h和c,分別表示最高塔的高度以及此高度塔的種類數。

因為種類數可能較多,請將c對10^9+7取模後的值輸出。

資料範圍

0≤w,b≤10^5

輸入樣例:

1 1
輸出樣例:

1 2
首先我們考慮如何算塔的最大高度,如果不考慮顏色,總共有w+b個立方體,然後高度為h需要h(h+1)/2塊,那麼

h(h+1)/2<=w+b 就能算出最大的h。這個h就是合法的最大高度。因為 h(h+1)/2 >=min(w,b).  畫乙個高度為h的立方體塔,觀察能夠發現乙個規律,取這h層中的若干層,塊數之和肯定能夠湊出1到h(h+1)/2中的任意數字。所以就算最大高度不需要考慮顏色。

然後考慮如何算高度為h的最大方案數。有w塊白色。那麼最多使用w塊白色。我們先算一下選0到w塊白色的方案數。有1到h層,每層是白色或者黑色,那麼這就是01揹包計算方案數了。然後列舉白色塊數,假設塊數為i,那麼需要h(h+1)/2-i塊,如果h(h+1)/2-i<=b.那麼選i塊白色合法。答案加上f[i].   (f[i]是使用i塊白色的方案數,通過01揹包算出來的)

#include using namespace std;

typedef long long ll;

const int maxn=1e5+5;

const int mod=1e9+7;

ll f[maxn];

int w,b,h;

int main()

}ll ans=0;

for(int i=0;i<=w;i++)

}printf("%d %lld\n",h,ans);

return 0;

}

3D 旋轉立方體

source cube src.js var cube function this.5 function d,e,a if e if a this.1 this.1 function p j,g,b,o this.7 function this.3 function this.4 function ...

3D立方體旋轉

1 首先要知道3d,x軸,y軸,z軸的方向 如圖所示 2 要想做乙個立方體首先是做6個面 以中間為基準 中間向前面平移150px transform translatez 150px 後面也平移150px,然後旋轉 rotatey 180deg 這樣前後面就做完了。左 以中間為準逆時針針旋轉90度 ...

3d實現立方體

3d 俗稱3d變換,指基於3d立體的角度來設定盒子。例如,將盒子設定為立方體。3d的效果跟2d是一樣的,有平移和旋轉,不同點在於,2d只有x軸和y軸,3d會多乙個z軸,用於表示立體。3d的效果通過需要遠距離觀察才能看出立體效果,因為距離太近,我們只能看出平面的2d效果,這就需要在設定3d變換效果之前...