接下來一行,包含n個整數,按順序給出每堆石子的大小 。
1 2 3 4 5
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAX 1005
using namespace std;
int arr[MAX], Min[MAX][MAX],s[MAX];
void dp(int n)
{
int i, j,k, r, t;
for (int i = 1;i <= n;i++)
Min[i][i] = 0;
for (r = 2;r <= n;r++)
for (i = 1;i <= n-r+1;i++)
{
j = i + r - 1;
Min[i][j] = Min[i + 1][j] +s[j]-s[i-1];
for (k = i+1;k < j;k++)
t = Min[i][k] + Min[k + 1][j]+s[j]-s[i-1],
Min[i][j] = min(Min[i][j], t);
}
}
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i++)
scanf("%d", &arr[i]),s[i]=s[i-1]+arr[i];
dp(n);
cout << Min[1][n];
return 0;
}