E28【模板】区间DP 石子合并

视频链接:https://www.bilibili.com/video/BV1gz4y1y7Rv/

Luogu P1775 石子合并(弱化版)

#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];
}

 

Luogu P5569 [SDOI2008] 石子合并

 

posted @ 2023-04-10 10:14  董晓  阅读(541)  评论(0编辑  收藏  举报