請不要吝嗇你的點讚!!!
有 n 個西瓜,編號為0 到 n-1,每個西瓜上都標有乙個數字,這些數字存在陣列 nums 中。
現在要求你戳破所有的西瓜。每當你戳破乙個西瓜 i 時,你可以獲得 nums[left] *nums[i] *nums[right] 個硬幣。 這裡的 left 和 right 代表和 i 相鄰的兩個西瓜的序號。注意當你戳破了西瓜 i 後,西瓜 left 和西瓜 right 就變成了相鄰的西瓜。
求所能獲得硬幣的最大數量。
共兩行。
第一行:乙個正整數n,代表西瓜個數。
第二行:共n個數字,每個數字表示西瓜上標的數字。
一行,乙個整數,獲得硬幣的最大數量。
4
3 1 5 8
167
你可以假設 nums[-1] = nums[n] = 1,但注意它們不是真實存在的西瓜,所以並不能被戳破。
0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
首先根據資料範圍,我們可以推斷
然後我們再來看看。。。。
首先,我們分析一下題目,可以發現:
那麼明顯他是乙個(i-1,i+1)的開區間;
但是題目卻是要求把所有的氣球給戳完,結合提示,我們就可以把題目改一下:
在一排氣球中,請你戳破氣球 0 和氣球 n+1 之間的所有氣球(不包括 0 和 n+1),
使得最終只剩下氣球 0 和氣球 n+1 兩個氣球,最多能夠得到多少分?
設狀態dp[i][j],表示戳破第i個到第j個的氣球(因為是開區間,不包括i和j);
那麼其實就轉換為了求dp[0][n+1];
氣球 i 和氣球 j 之間的所有氣球都可能是最後被戳破的那乙個,不防假設最後戳破的為 k
現在我們就很好做了,對吧?
首先因為最後戳的是k所以要先把i到k的全部戳破,答案為dp[i][k];
然後k到j肯定也要戳完吧?答案為dp[k][j];
現在在氣球i到氣球j之間就只剩下i,k,j了,又因為i到k,k到j之間的所有氣球全部被戳了,所以戳爆k的價值就是nums[i]*nums[k]*nums[j]啦!!!
所以這道題就出來啦!!!
#include
int dp[
505]
[505];
int a[
505]
;int
max(
int x,
int y)
intmain()
a[0]=
1;a[n+1]
=1;for
(int i=n;i>=
0;i--)}
}printf
("%d"
,dp[0]
[n+1])
;return0;
}
題解 戳西瓜
有 n 個西瓜,編號為 0 00 到 n 1 n 1n 1 每個西瓜上都標有乙個數字,這些數字存在陣列 num snums nums 中。現在要求你戳破所有的西瓜。每當你戳破乙個西瓜i ii時,你可以獲得 num s le ft nums i nums rig ht nums left nums i...
To Heart 題解 內需消費
題目鏈結 首先,我們先假設這道題不需要修改物價,那麼我們如何找到最好的情況呢?差分。如下數列 1 4 3 5 2很容易觀察出,在第乙個商店到第二個商店中,我們最多可以賺3元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...
To Heart 題解 內需消費
題目鏈結 首先,我們先假設這道題不需要修改物價,那麼我們如何找到最好的情況呢?差分。如下數列 1 4 3 5 2很容易觀察出,在第乙個商店到第二個商店中,我們最多可以賺3元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...