1026 插入乘号

#include<iostream>
using namespace std;


long long func(int arr[],int n, int k) {
    // dp[i][j]表示在第1到第i个数里面插入j个乘号得到的最大值
    long long dp[n+1][n+1];
    long long sum[n+1];
    sum[0]=0;
    // 存储累加和
    for(int i=1; i<=n;i++) 
    {
        sum[i] = sum[i-1] + arr[i];
    }
    for(int i=1; i<=n;i++) {
        dp[i][0] = sum[i];
    }
    for(int i=2;i<=n;++i)
        for(int j=1;j<i;++j)
            dp[i][j]=-1;

    // j表示乘法符号个数
    for(int j=1;j<=k;++j)
    {
        // 乘号可以放入的范围,[1,i]
        for(int i=j+1;i<=n;++i)
        {
            // 乘号放入k位置,k之前的位置已经被测试过了
            for(int k=j+1;k<=i;++k)
            {
                // dp[k-1][j-1]表示乘法插入后的左部分,sum[i] = sum[k-1]表示右部分
                dp[i][j]=max(dp[i][j],dp[k-1][j-1]*(sum[i]-sum[k-1]));
            }
        }
    }
    return dp[n][k];
}



int main() {
    int n_test;
    cin >> n_test;
    for(int i=0; i<n_test; i++){
        int n;
        int k;
        cin>>n;
        cin>>k;
        int arr[n+1];
        for(int j=1;j<=n;j++){
            cin >> arr[j];
        }
        cout<<func(arr,n,k)<<endl;
    }   
    return 0;
}