题目 <https://leetcode-cn.com/problems/burst-balloons/>
没想到dp是这么构建的,怀疑智商了。。。
#define max(a,b) ((a)>(b)?(a):(b))
int maxCoins(int* nums, int numsSize){
int *balloon = malloc(sizeof(int) * (numsSize+2));
int i,j,k;
balloon[0] = 1;
for(i=0;i<numsSize;i++){
balloon[i+1] = nums[i];
}
balloon[numsSize+1] = 1;
int **dp = malloc(sizeof(int*) * (numsSize+2));//dp[i][j]表示戳破(i,j)中所有气球获得的最多硬币
for(i=0;i<numsSize+2;i++){
dp[i] = malloc(sizeof(int) * (numsSize+2));
}
for(i=0;i<numsSize+2;i++){
for(j=0;j+i<numsSize+2;j++){
if(i == 0){
dp[j][j] = 0;
}else if(i == 1){
dp[j][j+1] = 0;
}else{
dp[j][j+i] = INT_MIN;
for(k=j+1;k<j+i;k++){
//printf("%d[%d] %d[%d] %d[%d]\n",j,balloon[j],j+i,balloon[j+i],k,balloon[k]);
dp[j][j+i] = max(dp[j][j+i],dp[j][k] + dp[k][j+i] + balloon[j]*balloon[j+i]*balloon[k]);
}
}
}
}
j = dp[0][numsSize+1];
for(i=0;i<numsSize+2;i++){
free(dp[i]);
}
free(dp);
free(balloon);
return j;
}