312. 戳气球 Burst Balloons

题目 <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;
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/111667828