区间dp,i表示区间长度,j表示区间起始,k遍历区间内的任意一点
二位数组初始化为0卡了很久,对c的函数都不熟悉了,memset只能对一维指针使用,里面参数也要注意
class Solution {
public:
int maxCoins(vector<int>& nums) {
int* dpnums = new int[nums.size()+2];
dpnums[0] = 1;
dpnums[nums.size()+1] = 1;
for(int i=0, j=1; i<nums.size(); i++, j++) dpnums[j] = nums[i];
int len=nums.size()+2;
int** d=new int *[len];
for(int i=0;i<len;i++){d[i]=new int[len];memset(d[i],0,len*sizeof(int));}
// memset(d,0,sizeof(d));
for(int i=2;i<len;i++){
for(int j=0;j+i<len;j++){
for(int k=j+1;k<j+i;k++){
d[j][j+i]=max(d[j][j+i],d[j][k]+d[k][j+i]+dpnums[j]*dpnums[k]*dpnums[j+i]);
// d[j][j+i]=dpnums[j]*dpnums[k]*dpnums[j+i];
}
}
}
// for(int i=0;i<len;i++)printf("%d\t",dpnums[i] );
// printf("\n");
// for(int i=0;i<len;i++){for(int j=0;j<len;j++)printf("%d ",d[i][j] );printf("\n");}
return d[0][len-1];
}
};