To Heart 題解 戳西瓜

2021-10-08 06:30:49 字數 1541 閱讀 7718

請不要吝嗇你的點讚!!!

有 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元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...