zoj 2860 - Breaking Strings 区间dp优化(四边形不等式)

本文探讨了如何在给定的字符串上进行多次切割操作以达到最小化总成本的目标。通过将问题转化为多个子字符串的合并问题,并采用类似于区间动态规划的方法解决。提供了一段C++代码实现,展示了如何计算最优切割顺序。

L - Breaking Strings

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Submit Status

Description

A certain string-processing language allows the programmer to break a string into two pieces. Since this involves copying the old string, it costs n units of time to break a string of n characters into two pieces. Suppose a programmer wants to break a string into many pieces. The order in which the breaks are made can affect the total amount of time used. For example, suppose we wish to break a 20 character string after characters 3, 8, and 10 (numbering the characters in ascending order from the left-hand end, starting from 1). If the breaks are made in left-to-right order, then the first break cost 20 units of time, the second break costs 17 units of time, and the third breaks costs 12 units of time, a total of 49 units of time (see the sample below). If the breaks are made in right-to-left order, then the first break costs 20 units of time, the second break costs 10 units of time, and the third break costs 8 units of time, a total of 38 units of time.

The cost of making the breaks in left-to-right order:

thisisastringofchars     (original)
thi sisastringofchars    (cost:20 units)
thi sisas tringofchars   (cost:17 units)
thi sisas tr ingofchars  (cost:12 units)
                         Total: 49 units.

 

The cost of making the breaks in right-to-left order:

thisisastringofchars     (original)
thisisastr ingofchars    (cost:20 units)
thisisas tr ingofchars   (cost:10 units)
thi sisas tr ingofchars  (cost: 8 units)
                         Total: 38 units.

 

Input:

There are several test cases! In each test case, the first line contains 2 integers N (2<=N<=10000000) and M (1<=M<=1000, M<N). N is the original length of the string, and M is the number of the breaks. The following lines contain M integers Mi (1<=Mi<N) in ascending order that represent the breaking positions from the string's left-hand end.

Output:

For each test case, output in one line the least cost to make all the breakings.

Sample Input:

20 3
3 8 10

Sample Output:

37

题意:在一个长度为N的字符串上切M次,第i次切在第ai个字符后面,需要花费被切字符串长度,问怎么切花费最少。

 思路:最后一定是变成M+1个字符串,反过来看就是将m+1个字符串合并,和区间dp的经典问题石子合并一模一样。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#define Twhile() int T;scanf("%d",&T);while(T--)
#define ArrInit(a,b,n) for(int i=0;i<=n;i++)a[i]=b
#define ArrInit2(a,b,n,m) for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)a[i][j]=b
#define fora(i,a,b) for(int i=a;i<b;i++)
#define fors(i,a,b) for(int i=a;i>b;i--)
#define fora2(i,a,b) for(int i=a;i<=b;i++)
#define fors2(i,a,b) for(int i=a;i>=b;i--)
#define PI acos(-1.0)
#define eps 1e-6
#define INF 0x3f3f3f3f

typedef long long LL;
typedef long long LD;
using namespace std;
const int maxn=1000+11;
int N,M,K;
LL a[maxn];
LL dp[maxn][maxn];
int p[maxn][maxn];
int f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
/*
8e7t8fsgf
AC
*/
/*
bool OK(int x,int y)
{
    if(x>=1&&x<=N&&y>=1&&y<=M)return true;
    return false;
}*/

int main()
{
    while(~scanf("%d%d",&M,&N))
    {
        memset(dp,0,sizeof(dp));
        a[0]=0;
        fora2(i,1,N){int x;scanf("%d",&x);a[i]=x;p[i][i]=i;}
        N++;a[N]=M;p[N][N]=N;
        fora2(i,2,N)
        {
            fora2(j,1,N)
            {
                int en=j+i-1;
                if(en>N)break;
                LL sum=INF;
                fora2(k,p[j][en-1],p[j+1][en])
                {
                    
                    LL tem=dp[j][k]+dp[k+1][en]+a[en]-a[j-1];
                    
                    if(sum>tem)
                    {
                        sum=tem;
                        p[j][en]=k;
                    }
                }
                dp[j][en]=sum;
                
            }
        }
        printf("%lld\n",dp[1][N]);
    }
    return 0;
}

 

内容概要:本文围绕基于Matlab实现的面向光储充一体化社区的有序充电策略展开研究,旨在通过构建优化模型协调光伏发电、储能系统与电动汽车充电负荷之间的能量流动关系,解决综合能源系统中的充电调度问题。研究重点在于实现削峰填谷、降低用户用电成本、提升新能源就地消纳能力等多重目标。通过建立合理的数学优化模型,设定目标函数与约束条件,并借助Matlab工具完成求解与仿真分析,系统展示了如何将复杂的实际工程问题转化为可计算的优化问题,进而为社区级能源管理提供科学决策支持。代码实现部分详尽呈现了系统建模流程与算法求解细节,有助于读者深入理解有序充电策略的技术内涵与实现路径。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员及相关领域工程师,特别适用于从事综合能源系统、电动汽车调度、智能电网、微电网运行等方向的研究与开发人员。; 使用场景及目标:①学习光储充一体化系统的协同运行机制与能量管理策略;②掌握基于Matlab的优化建模方法与求解技术;③复现并改进有序充电调度算法,服务于学术论文撰写或实际工程项目开发;④为后续开展微电网优化调度、需求响应、分布式能源协调控制等相关课题奠定技术基础。; 阅读建议:建议结合Matlab代码逐行分析模型构建逻辑,重点关注目标函数的设计思路与各类物理、运行约束的数学表达方式,尝试调整负荷参数、新能源出力曲线或引入不同优化算法以观察策略敏感性,从而深刻把握有序充电策略的核心原理与应用潜力。
内容概要:本文介绍了名为《考虑源网荷储协调的主动配电网优化调度方法研究》的技术文档,重点围绕主动配电网中“源---储”多环节的协调优化问题展开,提出了一种基于Matlab代码实现的优化调度模型。该模型综合考虑了分布式电源(如光伏、风电)、电网结构、负荷需求以及储能系统的协同运行,旨在提升配电网的运行效率、经济性和可靠性。文中详细阐述了数学建模过程,涵盖目标函数的设计(如最小化运行成本、降低网络损耗、提高新能源消纳能力)与多重约束条件(如功率平衡、设备容量限制、电压稳定性等)的处理,并通过Matlab平台进行算法求解与仿真验证,充分展示了所提优化调度策略的有效性与实用性。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab编程,从事新能源、智能电网、优化调度等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习和复现先进的主动配电网多主体协调优化调度方法;② 掌握利用Matlab求解复杂电力系统优化问题的建模与编程技巧;③ 为相关课题研究(如微电网调度、综合能源系统)提供技术参考和代码基础。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践,深入理解模型构建的细节和算法实现逻辑,可尝试修改参数或扩展模型以适应不同的研究场景,从而深化对主动配电网优化调度核心技术的掌握。
内容概要:本文介绍了《【复现】电动汽车聚合可行域的内-外结合近似方法(Matlab代码实现)》这一技术资源,聚焦于电动汽车(EV)集群在电力系统中的灵活调节能力建模问题,提出了一种融合内部逼近与外部逼近的聚合可行域近似方法。该方法通过数学建模与数值计算手段,精确刻画大规模电动汽车群体充放电行为所形成的聚合可行域,服务于电力系统优化调度、需求响应及车网互动(V2G)等应用场景。资源采用Matlab编程实现,综合利用凸包计算、包络线提取、约束松弛与迭代优化等算法,对外部边界进行几何逼近,对内部可行点集进行采样构造,从而构建高精度、可计算的聚合模型。该实现强调对原始复杂模型的工程化简化与高效复现,有助于研究人员快速掌握核心算法并应用于实际系统仿真。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网、电动汽车调度、综合能源系统等方向的工程技术人员,尤其适合希望复现高水平学术论文算法的研究者。; 使用场景及目标:① 深入理解电动汽车集群聚合建模的数学原理与内-外结合近似策略的设计逻辑;② 复现并验证先进论文中的关键建模技术,提升科研效率与算法实现能力;③ 将该聚合模型集成至微电网调度、日前-实时协同优化、电力市场仿真等高层应用中,支撑大规模EV参与电网灵活调节的仿真分析与决策支持。; 阅读建议:建议学习者结合Matlab代码逐行解析算法流程,重点关注可行域约束的数学建模、内外逼近的迭代机制及可视化呈现方式;推荐通过调整EV数量、修改充放电参数或引入不确定性因素等方式进行拓展实验,深化对模型鲁棒性与适应性的理解,并可尝试与模型预测控制(MPC)、鲁棒优化等高级调度算法相结合开展进一步研究。
内容概要:本文档详细介绍了一种基于Simulink的光伏储能单相逆变器并网仿真模型的构建与实现方法,聚焦于逆变器并网过程中的核心控制策略、系统建模及仿真分析。该模型全面实现了光伏储能系统通过单相逆变器接入电网的全过程仿真,涵盖最大功率点跟踪(MPPT)、PWM调制控制、并网同步、有功与无功功率调节以及电网故障下的动态响应等关键环节。通过对控制器的设计与参数整定,能够深入研究系统在不同运行工况下的动态特性,验证控制算法的有效性与鲁棒性,为实际工程应用中逆变器控制系统的设计、优化与测试提供可靠的理论依据和技术支持。; 适合人群:具备电力电子技术、新能源发电系统或自动控制理论基础,熟悉Simulink/MATLAB仿真环境,从事新能源并网技术研究、电力系统自动化及相关领域科研、教学或工程开发工作的技术人员、高校教师及研究生。; 使用场景及目标:①作为高校电气工程、新能源科学与工程等专业的教学案例,用于课程设计与实验教学;②支撑科研项目中对并网逆变器控制策略(如PI控制、重复控制、下垂控制等)的验证与性能对比分析;③为企业在光伏逆变器产品研发过程中提供标准化仿真测试平台,缩短开发周期,降低实验成本; 阅读建议:建议读者结合电力电子变换原理与自动控制理论,按照模块化思路逐步搭建系统模型,重点关注锁相环(PLL)设计、电流环控制器参数整定及系统稳定性分析,并可通过改变光照强度、温度、电网电压等外部条件开展多场景仿真,以深化对并网系统动态行为的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值