題目鏈接:https://vjudge.net/contest/329530#problem/J
dp【i】【j】【k】:i,j表示區間【i,j】,k表示分爲k堆石子。dp表示區間【i,j】分爲k堆石子的最小价值
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,l,r;
int A[110],dp[110][110][110];
int main()
{
while(~scanf("%d%d%d",&n,&l,&r))
{
for(int i=1; i<=n; i++)
scanf("%d",&A[i]),A[i] += A[i-1];
memset(dp,0x3f,sizeof(dp));
for(int i=1; i<=n; i++)
{
for(int j=i; j<=n; j++)
{
dp[i][j][j-i+1]=0;
}
}
for(int len=1; len<=n; len++)
{
for(int i=1; i+len<=n; i++)
{
int j=i+len;
for(int v=i; v<j; v++)
{
for(int k=l-1; k<=r-1; k++)
{
dp[i][j][1]=min(dp[i][j][1],dp[i][v][1]+dp[v+1][j][k]+A[j]-A[i-1]);
}
}
for(int k=2; k<=j; k++)
{
for(int v=i; v<j; v++)
{
dp[i][j][k]=min(dp[i][j][k],dp[i][v][1]+dp[v+1][j][k-1]);
}
}
}
}
if(dp[1][n][1]>=1e9)
printf("0\n");
else
printf("%d\n",dp[1][n][1]);
}
}
/*
7 4 4
4 8 6 1 2 4 6
5 3 3
1 2 3 4 5
*/