tyvj1014 - 乘法游戏 ——记忆化搜索DP

时间:2022-10-20 08:40:20

题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1014

f[i][j]表示区间[i,j]所得到的最小值。

不断地划分区间,把结果保存起来。

 #include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
long long int f[][];int a[], i, j, n, INF=0x7f7f7f7f;
void dfs(int l, int r) {
if(r-l<=) {f[l][r]=; return;} if(f[l][r]!=INF) return;
for(int i=l+;i<=r-;++i) dfs(,i),dfs(i,r),f[l][r]=min(f[l][r],f[l][i]+f[i][r]+a[i]*a[l]*a[r]);
}
int main(void) {
freopen("in1.txt","r",stdin);
scanf("%d",&n);for(i=;i<=n;scanf("%d",a+i++))
;for(i=;i<=n;++i)for(j=;j<=n;++j)f[i][j]=INF;dfs(,n);printf("%lld\n",f[][n]);
return ;
}

=_=