乘号加号

感觉还是不太明白它 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;
}

 

posted @ 2020-12-11 23:03  樱雪喵  阅读(124)  评论(1编辑  收藏  举报