P1775 题解
题目传送门
思路
本题考察基本的区间 DP。
令
初始化不难想。既然要求最小值,就可以将
然后考虑转移。一个大区间
最终答案即为
那么枚举顺序是什么?区间 DP 的转移是由小区间合并成为大区间,所以要先枚举区间长度
由于
AC CODE
#include<bits/stdc++.h>
using namespace std;
int read(){int x=0;char f=1,ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
const int N=300+10,MAX=1e8;
int a[N],p[N],dp[N][N];
int main(){
int n=read();
for(int i=1;i<=n;++i){
a[i]=read();
p[i]=p[i-1]+a[i];
}
#define sum(l,r) p[r]-p[l-1]
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
dp[i][j]=MAX;
for(int len=2;len<=n;++len)
for(int l=1;l+len-1<=n;++l){
int r=l+len-1;
for(int k=l;k<r;++k)
dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+sum(l,r));
}
printf("%d\n",dp[1][n]);
return 0;
}