石子合并——圆形版

这篇博客探讨了石子合并问题的圆形版本,通过将圆形转换为直线处理方式,详细阐述了如何计算最小得分,包括初始化、区间长度枚举、起始位置计算等步骤,并解释了如何处理坐标超过范围的情况。
摘要由CSDN通过智能技术生成

石子合并的圆形版和直线版差不多,关键是怎么把圆变成直线来处理。
以最小值为例:
1.先初始化mi[m][m];
2.枚举区间长度len,当区间长度为1时,相应的mi[len][i] = 0;
3.枚举起始位置i;
4.枚举插入位置,mi[j][i]代表从i开始,长度为j的最小得分。
5.将圆变成直线的方法是,当i+j大于n时,第二段开始的位置就要重新计算,
设pos为第二段开始的坐标,pos =int pos = (i+j)%n if(pos == 0) pos = n;
dp[i][j] = min(dp[i][j],dp[j][i]+dp[len-j][pos]+getsum[j][i]);
6.getsum(j,i)计算的是从i开始,长度为j的所有石子数量的和,如果i+len-1<=n
getsum(j,i) = sum[j]-sum[i-1];
如果大于
就要算出从第i堆到第n堆的石子数量,和第一队到第pos堆的石子数量

这里写图片描述


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int inf = 100000000;
const int m = 105;
int mi[m][m];
int ma[m][m];
int a[m];
int sum[m];
int mis,mas,n;

int gets
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值