Codeforces 1178 F2 Long Colorful Strip —— 记忆化区间DP

本文深入探讨一种复杂的区间动态规划问题,旨在计算在给定条形和颜色约束下,如何有效填充颜色以达到特定分布的目标。通过合并连续相同颜色区间,采用递归方式枚举分割点,最终实现高效求解方案数量。

This way

题意:

给你一个长度为m的条,现在有n种颜色,从1开始填色,你可以将一段连续的相同颜色的区间填成这个颜色,最后要使得这个条的颜色分布如下,问你有多少种填法。

题解:

比较难的区间DP。
首先将连续的相同值区间合并,因为我们知道如果a[i]=a[i-1],那么在这个位置就一定不会有分割的情况。
dp一个区间的时候找到这个区间的最小值,因为它是基础,在做完它之后就不会在做到这个数了。
那么这个最小数的区间建立之后,将整个区间划分成了3个,
就像这样:
在这里插入图片描述
我们dp出前面的区间的情况数*后面区间的情况数*中间的情况数就是答案。
也就是枚举分割点在l-minl,r-minr的情况。
对于中间的情况,递归下去做即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5,M=1e3+5;
const ll mod=998244353;
int a[N];
ll dp[M][M];
vector<int>vec[M];
ll dfs(int l,int r)
{
    if(l>r)
        return 1;
    if(~dp[l][r])
        return dp[l][r];
    int mi=a[l];
    for(int i=l;i<=r;i++)
        mi=min(mi,a[i]);
    int le=vec[mi][0],rig=vec[mi][(int)(vec[mi].size()-1)];
    ll a_l=0,a_r=0,ans=0;
    for(int i=l;i<=le;i++)
        a_l=(a_l+dfs(l,i-1)*dfs(i,le-1))%mod;
    for(int i=rig;i<=r;i++)
        a_r=(a_r+dfs(rig+1,i)*dfs(i+1,r))%mod;
    ans=a_l*a_r%mod;
    for(int i=0;i<vec[mi].size()-1;i++)
        ans=ans*dfs(vec[mi][i]+1,vec[mi][i+1]-1)%mod;
    dp[l][r]=ans;
    return ans;
}
int main()
{
    memset(dp,-1,sizeof(dp));
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d",&a[i]);
    int all=unique(a+1,a+1+m)-a-1;
    for(int i=1;i<=all;i++)
        vec[a[i]].push_back(i);
    if(all>2*n)
        return 0*printf("0\n");
    printf("%lld\n",dfs(1,all));
    return 0;
}

内容概要:本文围绕“考虑储能和可再生能源误差的售电公司购售电策略”展开,基于Python代码实现,构建了日前调度和日内调度两个时间尺度下的优化模型,旨在帮助售电公司在存在可再生能源出力不确定性及储能系考虑储能和可再生能源误差的售电公司购售电策略(Python代码实现)统参与的情况下,制定最优购售电决策。研究综合考虑了电价波动、负荷需求、储能充放电特性以及风光发电预测误差等因素,通过数学建模与优化算法求解,降低运营风险并提升经济效益。文中强调该策略为顶级SCI复现工作,具有较强的学术参考价值和技术实用性,并配套提供完整的代码资源供学习与验证。; 适合人群:具备一定电力系统基础知识和Python编程能力的研究生、科研人员及从事能源交易、智能电网优化等相关领域的工程技术人员。; 使用场景及目标:① 掌握含不确定性因素的电力市场购售电优化建模方法;② 学习多时间尺度调度框架的设计与实现;③ 复现高水平SCI论文中的优化策略,提升科研能力与项目实践水平。; 阅读建议:建议读者结合提供的Python代码逐模块分析,重点关注目标函数构建、约束条件设置及求解器调用过程,同时可借助文中提及的YALMIP等工具包深入理解优化模型的实现细节,推荐在实际数据基础上进行调试与扩展实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值