题目:乘法游戏
思路:
f[i][ed]表示[i][ed]段的最小得分,枚举划分点k,f[i][ed]=min(f[i][ed],f[i][k]+f[k][ed]+a[i]*a[k]*a[ed])。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define inf (1<<30)
int n;
int a[maxn+5];
int f[maxn+5][maxn+5]={0};
void readin(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
}
int dp(){
for (int j=3;j<=n;j++){
for (int i=1;i<=n-j+1;i++){
int ed=i+j-1;
f[i][ed]=inf;
for (int k=i+1;k<ed;k++){
f[i][ed]=min(f[i][ed],f[i][k]+f[k][ed]+a[i]*a[k]*a[ed]);
}
}
}
return f[1][n];
}
int main(){
readin();
int ans=dp();
printf("%d",ans);
return 0;
}