P1880 石子合并求条(我咋这么蒻,模板都不会打了...)
  • 板块灌水区
  • 楼主Z_L_H
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/19 13:16
  • 上次更新2024/10/19 15:25:02
查看原帖
P1880 石子合并求条(我咋这么蒻,模板都不会打了...)
1510234
Z_L_H楼主2024/10/19 13:16

全程瞎写...轻点喷

#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001],a[100001],s[100001];
int main()
{
	int n;
	cin>>n;
	for(int i = 1;i <= n;i ++)
	{
		cin>>a[i];
		s[i] = s[i - 1] + a[i];
		a[i + n] = a[i];
	}
	for(int i = n + 1;i <= 2 * n;i ++)
	{
		s[i] = s[i - 1] + a[i];
	}
	for(int l = 2;l <= n;l ++)
	{
		for(int i = 1;l + i - 1 <= 2 * n;i ++)
		{
			int j = l + i - 1;
			for(int k = i;k <= j - 1;k ++)
			{
				dp[i][j] = max(dp[i][k] + dp[k + 1][j],dp[i][j]);
			}
			dp[i][j] += s[j] - s[i - 1];
		}
	}
	int maxans = -1e9;
	for(int i = 1;i <= n;i ++)
	{
		maxans = max(maxans,dp[i][n + i - 1]);
	}
	memset(dp,0x3f,sizeof(dp));
	for(int i = 1;i <= n;i ++)
	{
		dp[i][i] = 0;
	}
	for(int l = 2;l <= n;l ++)
	{
		for(int i = 1;l + i - 1 <= 2 * n;i ++)
		{
			int j = l + i - 1;
			for(int k = i;k <= j - 1;k ++)
			{
				dp[i][j] = min(dp[i][k] + dp[k + 1][j],dp[i][j]);
			}
			dp[i][j] += s[j] - s[i - 1];
		}
	}
	int minans = 1e9;
	for(int i = 1;i <= n;i ++)
	{
		minans = min(minans,dp[i][n + i - 1]);
	}
	cout<<minans<<endl<<maxans;
	return 0;
}
2024/10/19 13:16
加载中...