求助“石子合并”
  • 板块题目总版
  • 楼主Wallacewwz
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/6/11 22:58
  • 上次更新2023/10/23 13:19:08
查看原帖
求助“石子合并”
660883
Wallacewwz楼主2023/6/11 22:58

这是一道石子合并问题,但它是排成一排的,我太菜了做不对,为此请教各位奆佬


【题目描述】

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;
}

可是它是不对的,有没有奆佬能帮我看一下哪里有问题

2023/6/11 22:58
加载中...