E28【模板】区间DP 石子合并
视频链接:https://www.bilibili.com/video/BV1gz4y1y7Rv/
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=310; int n, a[N], s[N]; int f[N][N]; //f[i][j]表示把从i到j合并成一堆的最小代价 int main(){ memset(f,0x3f,sizeof(f)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i], s[i]=s[i-1]+a[i], f[i][i]=0; for(int len=2; len<=n; len++) //区间长度 for(int i=1,j; (j=i+len-1)<=n; i++) //区间端点 for(int k=i; k<j; k++) //区间分割点 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]); cout<<f[1][n]; }