题目链接:传送门
从沈阳赛区打铁回来更一发(东北真冷啊)….
经典的dp问题
dp[i][j]是i到j的最小花费
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define mod 1000000007
#define N 101
int a[N],dp[N][N],sum[N];
int main(){
int i,j,n,m;
cin>>n;
sum[0]=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
if(i==1) sum[i]=a[i];
else sum[i]=sum[i-1]+a[i];
dp[i][i]=0;
}
for(int t=1;t<n;t++)
for(i=1;i<=n-t;i++){
j=i+t;
dp[i][j]=mod;
for(int k=i;k<=j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
cout<<dp[1][n]<<endl;
return 0;
}