《演算法設計與分析》第十二周作業

2021-09-01 20:30:12 字數 2937 閱讀 2238

標籤(空格分隔): 課堂作業

姓名:李**

學號:16340114

題目:burst balloons(

給定一串數字,每個數字代表乙個氣球,每個氣球都有乙個數值。每次扎破乙個氣球,可以得到該氣球左邊和右邊以及自身數字之積的硬幣,若果左/右沒有氣球,其數值為1。求能拿到的最大硬幣數

這個題目可以先從最簡單的情況出發,只有乙個氣球的時候,只能得到該氣球數值的硬幣數。對於一般情況,即氣球不止乙個時(下標從i到j)考慮最後乙個需要扎破的氣球。當這個氣球最後被扎破時,其餘被扎破的氣球都能獲得最大的硬幣,而扎破最後選定的氣球k的收益為num

s[i−

1]∗n

ums[

k]∗n

ums[

j+1]

nums[i-1]*nums[k]*nums[j+1]

nums[i

−1]∗

nums

[k]∗

nums

[j+1

],整段氣球的收益為:num

s[i−

1]∗n

ums[

k]∗n

ums[

j+1]

+coi

ns[i

tok−

1]+c

oins

[k+1

toj]

nums[i-1]*nums[k]*nums[j+1]\ +\ coins[i\ to\ k-1] + coins[k+1\ to\ j]

nums[i

−1]∗

nums

[k]∗

nums

[j+1

]+co

ins[

itok

−1]+

coin

s[k+

1toj

]用coins[i][j]表示nums[i…j]能獲取的最大硬幣數。(包含位置i與j),其值為:

( 1)

coin

s[i]

[j]=

0,wh

en

j<

i(1)coins[i][j]\ =\ 0,\ when\ j\ <\ i

(1)coi

ns[i

][j]

=0,w

henj2)

coin

s[i]

[j]=

nums

[i−1

]∗nu

ms[i

]∗nu

ms[i

+1],

when

j=

i(2)coins[i][j]\ =\ nums[i-1]\ *\ nums[i]\ *\ nums[i+1], when j\ =\ i

(2)coi

ns[i

][j]

=num

s[i−

1]∗n

ums[

i]∗n

ums[

i+1]

,whe

nj=i

( 3)

coin

s[i]

[j]=

max(

nums

[i−1

]∗nu

ms[k

]∗nu

ms[j

+1]+

coin

s[i]

[k−1

]coi

ns[k

+1][

j]

)(3)coins[i][j]\ =\ max(nums[i-1]\ * nums[k]\ * nums[j+1]\ +\ coins[i][k-1]\ coins[k+1][j])

(3)coi

ns[i

][j]

=max

(num

s[i−

1]∗n

ums[

k]∗n

ums[

j+1]

+coi

ns[i

][k−

1]co

ins[

k+1]

[j])

,

i<=k

<=j

,whe

nj

>

i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ,i<=k<=j, when j\ >\ i

,i<=k

<=j

,whe

nj>

i特別地,當nums下標越界時,其值為1。對(3)式中的coins[i][k-1],當k−1

<

ik-1k−

1<

i時,其值為0(k-1可能越界),coins[k+1][j]同理。

最後的答案為coins[0][nums.size()-1]。

用二維陣列儲存coins的狀態。在迴圈時,要先計算長度小的氣球串再到長度大的氣球串。注意判斷nums與coins的邊界狀態即可。

這個動態規劃問題的關鍵在於一般情況的硬幣數該怎麼算。想到只有乙個氣球時的抉擇,把這個抉擇推廣到一般情況,再稍微琢磨一下,便可求得coins的狀態表示式。

#define leftnum(x) (x==0 ? 1 : nums[x-1])

#define rightnum(x) (x==length-1 ? 1 : nums[x+1])

#define max(a, b) (a>b ? a : b)

class solution }}

int answer = coins[0][length-1];

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

delete coins[i];

delete coins;

return answer;

}};

第十二周作業

例題1 includeusing namespace std struct date struct student int main stu1,stu2 stu1.num 1001 stu1.age 20 stu2 stu1 cout includeusing namespace std struc...

第十二周作業

1 多文件窗體 mdi form 功能演示 2 日期控制項datetimepicker功能演示 3 月曆控制項monthcalender功能演示 4 樹型列表控制項treeview功能演示 tn.expand 展開tn節點 treeview1.selectednode tn1 把新增節點設定為當前選...

第十二周作業

一.jpanel 方法型別 描述public jpanel 構造建立乙個預設的jpanel物件,使用流布局管理器 public jpanel layoutmanager layout 構造建立乙個指定布局管理器的jpanel物件 二.jsplitpane 三.jtabbedpane 四.jscrol...