leetcode 312.Burst Balloons

区间dp


题意:

给你一个数组,你要爆掉所有数字,爆某个数字的时候会获得它现在相邻的两个数字和它的乘积.如果这个数字没有左相邻或右相邻,则乘1代替.

问爆掉所有数字的最高分数.


数据范围:

数组size<=500

数组元素<=100


思路:

区间dp,然而我不太会.

dp[i][j]表示爆掉[i,j]里所有数字后能获得的最大分数,那么我们枚举[i,j]里最后一个爆掉的数字的位置k.

由于我们只爆掉[i,j]里的元素,因此最后爆掉k的时候,k的左右邻居一定是i-1和j+1.

初始化为:dp[i][i]=arr[i-1]*arr[i]*arr[i+1]

递推式为:dp[i][j]=max(dp[i][k-1]+dp[k+1][j]+arr[i-1]*arr[k]*arr[j+1])

最后答案为:dp[0][size-1]


dp里需要挺多的边界判断,我们可以特殊处理一下.

比如让数组首尾各添加一个1,比如初始化可以让dp数组为0,然后从len=1开始递推.


区间按长度递增dp,一共有O(n2)个,每个需要枚举k,因此时间复杂度是O(n3).


总结:

区间dp,dp[i][j]表示爆掉[i,j]里所有数字后能获得的最大分数.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值