请问我这样做为什么错了?(还是不对)
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;
}
请问我这样做为什么错了?
[此贴子已经被作者于2022-8-26 16:48编辑过]