打氣球的最大分數

2021-09-26 06:26:53 字數 1513 閱讀 8305

給定乙個陣列arr,長度為n。代表排有分數的氣球。 每打爆乙個氣球都能獲得分數,假設打爆氣球的分數為x,獲得分數的規則如下:

1)如果被打爆氣球的左邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球,假設分數為l:如果被打爆氣球的右邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球,假設分數為r.獲得分數為l*x*r

2)如果被打爆的氣球的左邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球,假設分數為l:如果被打爆氣球的右邊所有氣球都已經被打爆,獲得分數為l*x。

3)如果被打爆氣球的左邊所有的氣球都已經被打爆:如果被打爆氣球的右邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球。獲得分數為x*r.

4)如果被打爆氣球的左邊和右邊所有的氣球都已經被打爆。獲得分數為x。

目標是打爆所有氣球,獲得每次打爆的分數。通過選擇打爆氣球的順序,可以得到不同的總分,請返回能獲得的最大分數。

輸出包括兩行,第一行包括乙個整數n(0<=n<=500),第二行包括n個整數,代表陣列arr (1<=arr[i]<=100)。
輸出包括乙個整數,代表可能獲得的最大分數。
示例1

3

3 2 5

50
2->1->3  3*2*5+3*5+5=50
示例2

8

23 4 45 65 23 43 54 56

639019
時間複雜度o(n^)o(n3),空間複雜度o(n^)o(n2)
//方法1:暴力遞迴   o(n!)

//執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。

//case通過率為4.76%

#includeusing namespace std;

//打爆arr[l..r]範圍上的所有氣球,返回最大的分數

//經過頭尾添1的操作,arr[l-1]和arr[r+1]一定存在

int process(vectorarr,int l,int r)

//最後打爆arr[l]的方案與打爆arr[r]的方案先比較一下

int res=max(arr[l-1]*arr[l]*arr[r+1]+process(arr,l+1,r),arr[l-1]*arr[r]*arr[r+1]+process(arr,l,r-1));

for(int i=l+1;i>n;

vectorarr(n+2,1); //頭尾加上兩個1,避免特殊情況的討論

for(int i=1;i<=n;i++)

coutint main()

vector> dp(n+2,vector(n+2,0));

for(int i=1;i<=n;i++)

for(int l=n;l>=1;l--)}}

cout

}

5695 N 次操作後的最大分數和

看到範圍應該想到dfs或者狀壓。那麼為什麼想狀壓,而不是dfs呢?首先dfs的話存在大量重複的可能。就是假設你前面都不一樣,但是到了後面的某一次操作選是一樣的 那其實最後一部分要去計算多次而已,但是跑dfs的話,前面一樣的操作會大量的進行。dp sta 表示當前選了的數字的二進位制串為st時候的最大...

YbtOJ 493 最大分數 斜率優化dp,分治

n 個數的乙個序列,給其中的一些數打上標記。乙個標記方案的貢獻為 s 1 表示有多少對 l,r 滿足區間 l,r 都被打上了標記,s 2 表示標記的數字和。貢獻為 s 1 s 2 m 次詢問,修改乙個數後,求最大的可能貢獻 詢問之間相互獨立 1 leq n,m leq 3 times 10 5 先把...

1189 「氣球」 的最大數量

給你乙個字串 text,你需要使用 text 中的字母來拼湊盡可能多的單詞 balloon 氣球 字串 text 中的每個字母最多只能被使用一次。請你返回最多可以拼湊出多少個單詞 balloon 示例 1 輸入 text nlaebolko 輸出 1 示例 2 輸入 text loonbalxbal...