这是一道石子合并问题,但它是排成一排的,我太菜了做不对,为此请教各位奆佬
【题目描述】
N 堆石子排成一排,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出一个算法,计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。
输入格式
数据的第 1 行是正整数 N,表示有 N 堆石子。
第 2 行有 N 个整数,第 i 个整数 a_i 表示第 i 堆石子的个数。
输出格式
输出共 2 行,第 1 行为最小得分,第 2 行为最大得分。
输入样例#1
输入#1
复制
4
4 5 9 4
输出样例#1
输出#1
44
54
以下是我的代码
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
//#define int long long
#define endl '\n'
#define ll long long
#define ull unsigned long long
using namespace std;
int n;
int a[205];
int sum[205];
int f[205][205];//f[i][j]表示合成第i~j个所能得到的最小得分
int dp[205][205];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(f,0x3f3f3f3f,sizeof(f));
memset(dp,-0x3f3f3f3f,sizeof(dp));
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
f[i-1][i] = a[i]+a[i-1];
f[i][i]=0;
dp[i-1][i] = a[i]+a[i-1];
dp[i][i]=0;
sum[i] = sum[i-1]+a[i];
}
for(int i = 2; i <= n; i++)
{
for(int l = 1; l + i - 1 <= n; i++)
{
int r = l + i - 1;
for(int k = l; k < r; k++)
{
f[l][r] = min(f[l][r],f[l][k]+f[k+1][r] + sum[r] - sum[l-1]);
dp[l][r] = max(dp[l][r],dp[l][k]+dp[k+1][r] + sum[r] - sum[l-1]);
}
}
}
cout << f[1][n] << endl << dp[1][n];
return 0;
}
可是它是不对的,有没有奆佬能帮我看一下哪里有问题