感觉还是不太明白它 std 给的那个循环边界问题呜呜呜
(但我认为我这样写似乎并没有问题......
设 f[i][j] 表示在前 i 个数中使用 j 次乘法后的最大答案。
所以就是 f[i][j]=max(f[i][j],f[k][j-1]*(sum[i]-sum[k]));
由于要求区间的和,所以使用前缀和优化。 sum 数组即前缀和数组。
#include<bits/stdc++.h>
using namespace std;
int n,k,a[101],f[101][101],sum[101],m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++)
{
f[i][0]=sum[i];
for(int j=1;j<=min(i-1,m);j++)
{
for(int k=j;k<i;k++)
{
f[i][j]=max(f[i][j],f[k][j-1]*(sum[i]-sum[k]));
}
}
}
cout<<f[n][m]<<endl;
return 0;
}