LINTCODE——吹气球
思路:dp[start][end] 表示从start到end的最大分数。当mid气球吹爆的时候,left和right变成相邻的气球,此时如果将mid吹爆再切割,则不方便转移,那么就以mid为分割点,先吹爆两侧的气球。mid最后吹爆:mid = nums[start-1]*nums[i]*nums[end+1];
class Solution {
public:
/*
* @param nums: A list of integer
* @return: An integer, maximum coins
*/
int maxCoins(vector<int> &nums) {
// write your code here
int n = nums.size();
vector<vector<int> > dp(n+2,vector<int>(n+2 ,0));
vector<vector<bool> > isVisited(n+2,vector<bool>(n+2 ,false));
nums.insert(nums.begin(),1);
nums.insert(nums.end(),1);
int res = search(dp,isVisited,nums ,1,n);
return res;
}
int search(vector<vector<int> > &dp,vector<vector<bool> > &isVisited , vector<int> &nums , int start , int end)
{
if(isVisited[start][end])
return dp[start][end];
int res = 0;
for(int i = start ; i <= end ;i++)
{
int mid = nums[start-1]*nums[i]*nums[end+1];
int left = search(dp,isVisited,nums,start,i-1);
int right = search(dp,isVisited,nums,i+1,end);
res = max(res,left + mid + right);
}
isVisited[start][end] = true;
dp[start][end] = res;
return res;
}
};