题意:每次从里面抽取一个数然后和相邻两个数相乘求出最小值,直到只剩头尾两个数
题解:dp[l][r]表示从l到r个数抽取一个数然后响铃两个数相乘最小值,用0表示还没有遍历过记忆化搜索那么转移方程就是
dp[l][r] = a[i]*a[l]*a[r]+dfs(l,i)+dfs(i,r); 取其中的最小值即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mx = 105;
int dp[mx][mx];
int a[mx];
int dfs(int l,int r){
if(r-l<2) return 0;
if(dp[l][r]) return dp[l][r];
for(int i = l+1; i < r; i++)
if(dp[l][r])
dp[l][r] = min(dp[l][r],a[i]*a[l]*a[r]+dfs(i,r)+dfs(l,i));
else
dp[l][r] = a[i]*a[l]*a[r]+dfs(l,i)+dfs(i,r);
return dp[l][r];
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
printf("%d\n",dfs(1,n));
}
return 0;
}