题目大意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少?
解题思路:用dp,转化为矩阵链乘问题,但要注意最后一前一尾两个数不能算进去,所以处理起来还是好一定的差别!!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=(1<<30);
const int maxn=100+50;
int f[maxn][maxn],p[maxn],n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
memset(f, 0, sizeof(f));
for (int len = 2;len < n; len++)
for (int i= 0; i + len < n; i++)
{
int j=i+len;
f[i][j] = INF;
for(int k = i + 1; k < j; k++)
f[i][j] = min(f[i][j], f[i][k] + f[k][j] + p[k] * p[i] * p[j]);
}
printf("%d\n",f[0][n-1]);
}