給定乙個陣列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...