看LRJ小白书第二版上面随便写的个程序,看到用递推可能对顺序的处理有些麻烦,所以就用了记忆化搜索。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include<map>
#define pi acos(-1.0)
#define eps 1e-6
#define INF 999999999
#define ll long long
using namespace std;
int vis[100][100];
int d[100][100];
int p[190];
int f(int x,int y)
{
if(vis[x][y])
return d[x][y];
vis[x][y]=1;
if(x==y)
return d[x][y]=0;
int tmp=INF;
for(int k=x;k<=y;k++)
{
tmp=min(tmp,f(x,k)+f(k+1,y)+p[x-1]*p[k]*p[y]);
}
return d[x][y]=tmp;//找到最小值后统一return ,而不是在for循环里面return
}
int main()
{
int n;
cin>>n;
memset(vis,0,sizeof(vis));
for(int i=0;i<n+1;i++)
cin>>p[i];
cout<<f(1,n)<<endl;
return 0;
}