【题解】洛谷P1880[NOI1995]石子合并 区间DP

该博客主要解析了洛谷P1880题目的解决方案,聚焦于区间动态规划(DP)的应用。通过定义mx[l,r]和mn[l,r]表示区间[l,r]内石子合并的最大和最小得分,博主给出了状态转移方程,并详细阐述了初始状态的设定。在处理这类环形问题时,博主提到了将问题翻倍拼接的策略。" 79066874,6899562,Windows环境下PHP7.x安装指南,"['PHP', '服务器环境', 'Apache', 'Windows开发', '版本升级']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
在这里插入图片描述


m x [ l , r ] mx[l,r] mx[l,r] 表示区间 [ l , r ] [l,r] [l,r] 合并的最大得分,同理设 m n [ l , r ] mn[l,r] mn[l,r] 表示区间 [ l , r ] [l,r] [l,r] 合并得到的最小得分。
m x [ l , r ] = max ⁡ l ≤ k &lt; r { m x [ l , k ] + m x [ k + 1 , r ] } + ∑ i = l r a i mx[l,r]=\max\limits_{l\leq k&lt;r}\{mx[l,k]+mx[k+1,r]\}+\sum_{i=l}^ra_i mx[l,r]=lk<rmax{mx[l,k]+mx[k+1,r]}+i=lrai
m n [ l , r ] = min ⁡ l ≤ k &lt; r { m n [ l , k ] + m n [ k + 1 , r ] } + ∑ i = 1 r a i mn[l,r]=\min\limits_{l\leq k&lt;r}\{mn[l,k]+mn[k+1,r]\}+\sum_{i=1}^ra_i mn[l,r]=lk<rmin{mn[l,k]+mn[k+1,r]}+i=1rai
初值: m x mx mx 全为 0 0 0 ∀ x ∈ [ 1 , 2 N ] , m n [ x , x ] = 0 \forall x\in[1,2N],mn[x,x]=0 x[1,2N],mn[x,x]=0,其余全为 + ∞ +\infty +

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[210],mx[210][210],mn[210][210],sum[210],n,maxn,minn;
int main()
{
	//freopen("in.txt","r",stdin);
    scanf("%d",&n);memset(mn,0x3f,sizeof(mn));
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),a[i+n]=a[i];
    for(int i=1;i<=2*n;i++)
	    mn[i][i]=0,sum[i]=sum[i-1]+a[i];
	for(int len=2;len<=n;len++)
	    for(int l=1;l<=2*n-len;l++)
	    {
	    	int r=l+len-1;
	    	for(int k=l;k<r;k++)
	    	    mn[l][r]=min(mn[l][r],mn[l][k]+mn[k+1][r]),mx[l][r]=max(mx[l][r],mx[l][k]+mx[k+1][r]);
	    	mn[l][r]+=sum[r]-sum[l-1];mx[l][r]+=sum[r]-sum[l-1];
		}
	minn=0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	    maxn=max(maxn,mx[i][i+n-1]),minn=min(minn,mn[i][i+n-1]);
	printf("%d\n%d\n",minn,maxn);
	return 0;
}

总结

处理环形问题常常翻倍拼接到后面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值