题目:
解题思路:
dp
题目数据比较水,
O(n4)
O
(
n
4
)
可以过
转移方程
for (int i=n-1;i>=1;i--)
for (int j=i+1;j<=n;j++)
for (int k=i;k<=j-1;k++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
w[i][j]=max(w[i][j],w[i][k]+w[k+1][j]+s[j]-s[i-1]);
}
源程序:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int f[101][101],o,w[101][101],sl[101],s[101],n,x,mi,ma;
int main()
{
scanf("%d",&n);
mi=2147483647;
for (int i=1;i<=n;i++)
{
scanf("%d",&sl[i]);
s[i]=s[i-1]+sl[i];
}
memset(f,127/3,sizeof(f));for (int i=1;i<=n;i++) f[i][i]=0;
for (int ii=1;ii<=n;ii++)
{
memset(f,127/3,sizeof(f));
for (int i=1;i<=n;i++) f[i][i]=0;
memset(w,0,sizeof(w));
for (int i=n-1;i>=1;i--)
for (int j=i+1;j<=n;j++)
for (int k=i;k<=j-1;k++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
w[i][j]=max(w[i][j],w[i][k]+w[k+1][j]+s[j]-s[i-1]);
}
for (int i=1;i<=n;i++)
{
s[i]=0;
s[i]=s[i-1]+sl[(i+ii-1)%n+1];
}
if (f[1][n]<mi) mi=f[1][n];
if (w[1][n]>ma) ma=w[1][n];
}
printf("%d\n%d",mi,ma);
}