动态规划的第一步是确定最优子结构
对Ai....Aj求最佳括号化,必然要在中间加一个分割点,原序列转化为两个子序列Ai..Ak , Ak+1..Aj 设d[i,j]表示计算链i~j所需的最小代价 原问题的代价 = Ai..Ak 的代价 + Ak+1..Aj + 两者相乘的代价 d[i][j] = d[i][k] + d[k+1][j] + p[k-1] * p[k] * p[k+1] k in (i,j) 如何利用最优子结构的性质 从子问题的最优解构造出原问题的最优解? 每个子问题的求解都要划分链,找到子问题最优的划分点,然后将子问题的最优解合并起来。 设s[i,j]记录子链i~j的最优划分点的位置,那么s[1,n]将链划分为两个子链,如此递归的划分,就得到了原问题的最优划分方案,
如此,计算出了每个区间的最优划分点。时间复杂度O(n^3)
根据每个区间的最优划分点还原出结果
void mer(int x,int y) { if(x>y)return; if(x==y)printf("A%d",x); else { printf("("); mer(x,s[x][y]); printf("*"); mer(s[x][y]+1,y); printf(")"); } }转载于:https://www.cnblogs.com/star-and-me/p/8642030.html
