区间dp (例子:基础课石子合并)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 333;
int a[N];
int dp[N][N];
int s[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
s[i]+=s[i-1]+a[i];
for(int len=2;len<=n;len++)//枚举区间长度
for(int i=1;i+len-1<=n;i++)//枚举左端点
{
int j=i+len-1;//右端点
dp[i][j]=1e9;//初始化设为max因为要求最小值
for(int qp=i;qp<j;qp++)//枚举分界点
{
dp[i][j]=min(dp[i][j],dp[i][qp]+dp[qp+1][j]+s[j]-s[i-1]);//合并一个区间等于合并其余两个区间的力气和加上这两个区间石子总重量
}
}
cout<<dp[1][n]<<endl;//dp[i][j]->合并从i到j所需要的力气
//
}