乘号加号
感觉还是不太明白它 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; }
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/14123305.html