注册 登录
编程论坛 C++教室

请问我这样做为什么错了?快来呀!!!

op123 发布于 2022-08-29 16:58, 1045 次点击
2117 - 【基础】石子合并(环形2)

题目描述
在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆最大得分。

输入
数据的第1行试正整数N,1≤N≤2000,表示有N堆石子;
第2行有N个数,分别表示每堆石子的个数。

输出
输出共1行,最大得分。

样例
输入复制
4
4 4 5 9
输出复制
54

来源
动态规划 区间动归

#include <bits/stdc++.h>//万能头文件,就是DEV-C++中可以包括除了#include<windows.h>以外所有头文件的头文件
using namespace std;
const int N = 2001;
int a[N*2],s[N*2];
int ma[N*2][N*2];
int n;
int main(){
    cin>>n;
    for(int i = 1;i <= n;i++){
        cin>>a[i];
        a[i+n] = a[i];
    }
    for(int i = 1;i <= n * 2;i++){
        s[i] = s[i-1] + a[i];
        ma[i][i] = 0;
    }
    for(int len = 2;len <= n;len++){
        for(int i = 1;i + len - 1 <= n * 2;i++){
            int j = i + len - 1;
            for(int k = i;k < j;k++){
                ma[i][j] = max(ma[i][j],ma[i][k]+ma[k+1][j]+s[j]-s[i-1]);
            }
        }
    }
    int maxn = 0;
    for(int i = 1;i <= n;i++)
        maxn = max(maxn,ma[i][i+n-1]);
    cout<<maxn<<endl;
    return 0;
}
请问我这样做为什么错了?

3 回复
#2
op1232022-09-04 17:57
讨了个没趣
#3
op1232022-09-04 17:57
#4
mature1192022-09-20 21:55
感觉用栈会不会很简单?
1