leetcode 312.Burst Balloons

来源:互联网 发布:plc和单片机的区别 编辑:程序博客网 时间:2024/05/10 00:01

区间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]里所有数字后能获得的最大分数.


0 0
原创粉丝点击