动态规划:dp[i][j]表示气球i到气球j的最佳coins
动态转移方程:
dp[i][j]=max(dp[i][k-1]+nums[i-1]*nums[k]*nums[j+1]+dp[k+1][j]) k∈[i,j]
class Solution {
public:
int maxCoins(vector<int>& nums) {
for(int i=0;i<nums.size();++i){
if(nums[i]==0){
nums.erase(nums.begin()+i);
--i;
}
}
int n=nums.size();
if(n==0) return 0;
//if(n==1) return nums[0];
//if(n==2) return nums[0]*nums[1]+max(nums[0],nums[1]);
nums.insert(nums.begin(),1);
nums.insert(nums.end(),1);
int m=nums.size();
vector<vector<int>> dp(m,vector<int>(m,0));
for(int count=1;count<=n;++count){
for(int start=1;start+count-1<=n;++start){
int bestcoins=0;
for(int b=0;b<count;++b){
bestcoins=max(bestcoins,dp[start][start+b-1]+nums[start-1]*nums[start+b]*nums[start+count]+dp[start+b+1][start+count-1]);
}
dp[start][start+count-1]=bestcoins;
}
}
return dp[1][n];
}
};
动态规划求解最佳气球爆破顺序
本文介绍了一种使用动态规划算法解决最佳气球爆破顺序问题的方法。通过定义状态dp[i][j]表示从气球i到气球j的最佳获得硬币数,并给出动态转移方程,实现了一个C++程序来找到爆破所有气球可以获得的最大硬币数。
858

被折叠的 条评论
为什么被折叠?



