【题意】题目链接http://poj.org/problem?id=1651
给出n(<=100)个数字,每一个数字有一个权值Ai,求从中抽出除了第一个和最后一个以外的中间的数字的最小费用。抽取的顺序不同最后总的费用也不同,每次抽取第i个数字的费用为a[i-1]*a[i]*a[i+1];例如:有5个数字分别为10 1 50 20 5;
如果抽出的顺序为1->20->50的话总费用为
10*1*50 + 50*20*5 + 10*50*5 = 500+5000+2500 = 8000
如果抽出的顺序为50->20->1的话总费用为
1*50*20 + 1*20*5 + 10*1*5 = 1000+100+50 = 1150
【分析】有三种方法:
方法一:用dp[i][j]表示区间(数组下标)i~j之间所有数字全部抽出后的最小费用(最后留下i和j);k表示i~j之间最后一个抽出的数字。
则有状态转移方程:dp[i][j] = min{dp[i][j] , dp[i][k] + dp[k][j] + a[i]*a[k]*a[j]};就是找到区间i~j之间最后一个取出哪个数字费用最小。
其中区间i~k和区间k~j之间的最小费用都已经算出,所以直接加上最后一次取出k的费用a[i]*a[k]*a[j]就是当前的总费用。
细节请看代码注释。
方法二:把他看成白书上的最优矩阵链乘,用dp[i][j]表示区间(数组下标)i-