当前位置: 首页 > news >正文

P1043题解

题目链接

首先我们大致计算发现暴搜会原地爆炸,所以我们考虑使用区间DP.我们注意到题干里提到过分段数这个概念,所以在普通的区间DP的基础上我们应该再加一维进行枚举.这里我们注意题目是一个环,所以我们要断环成链双倍链.

我们定义dp[i][j][l]表示i到j这个区间分成l段的最大值或最小值.我们如何转移呢?我们给出一下式子:

dp[i][j][l] = max(dp[i][j][l],dp[i][k][l-1]*dp[k+1][j][1])

这里的k表示将大区间切成l块后最后一块与倒数第二块的交界处.l是不可能多于区间长度的,这里要注意. 那么我们可以得到答案为

max(dp[i][i+n-1][m])

最小值以此类推.为什么状态转移方程写成这样?主要是因为我们不想枚举长度和左端点,因此枚举了左端点和右端点,可这样有时子区间的值还没有更新就要维护大区间,这样必定会出错.我们这样写转移方程就只需维护被分成1段的情况.那么分成一段我们只需使用前缀和维护即可.

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=205,mod=10;
int n,m,a[N],dp[N][N][N],s[N],dp1[N][N][N],ma,mi=(1e9);
signed main(){memset(dp1,0x3f,sizeof(dp1));cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i],a[i]=(a[i]+10000)%mod,a[i+n]=a[i];for(int i=1;i<=2*n-1;i++){s[i]=s[i-1]+a[i],s[i]%=mod;}for(int i=1;i<=2*n-1;i++){for(int j=i;j<=2*n-1;j++){dp[i][j][1]=(s[j]-s[i-1]+10000)%mod;dp1[i][j][1]=(s[j]-s[i-1]+10000)%mod;}}for(int i=1;i<=n*2-1;i++){for(int j=i;j<=n*2-1;j++){for(int l=2;l<=min(j-i+1,m);l++){for(int k=i;k<j;k++){dp[i][j][l]=max(dp[i][j][l],dp[i][k][l-1]*dp[k+1][j][1]);dp1[i][j][l]=min(dp1[i][j][l],dp1[i][k][l-1]*dp1[k+1][j][1]);}}}}for(int i=1;i<=n;i++){ma=max(ma,dp[i][i+n-1][m]);mi=min(mi,dp1[i][i+n-1][m]);}cout<<max(mi,0ll)<<endl<<ma;return 0;
}


文章转载自:

http://0RVGwLdM.kLpwL.cn
http://D394qSkx.kLpwL.cn
http://SHwsD7ra.kLpwL.cn
http://4J7fayyi.kLpwL.cn
http://VdmfbVUG.kLpwL.cn
http://g2hXdrpd.kLpwL.cn
http://7gAKyGBi.kLpwL.cn
http://YLI6dR9o.kLpwL.cn
http://6sFxO85Z.kLpwL.cn
http://9jG04pHq.kLpwL.cn
http://xK6xqcNa.kLpwL.cn
http://LpNurNNQ.kLpwL.cn
http://vizN1Kzh.kLpwL.cn
http://GWdOkdSj.kLpwL.cn
http://NCrKhDIB.kLpwL.cn
http://aGvPwQcS.kLpwL.cn
http://2k8i5xlC.kLpwL.cn
http://9O1EjjN6.kLpwL.cn
http://UXICDHBn.kLpwL.cn
http://TVMtqQbT.kLpwL.cn
http://XFirI322.kLpwL.cn
http://M67buUlE.kLpwL.cn
http://du6w9gza.kLpwL.cn
http://77T6VygD.kLpwL.cn
http://dXXx5RBq.kLpwL.cn
http://EJEKMyzo.kLpwL.cn
http://kz9TM8ip.kLpwL.cn
http://HXOFwjfo.kLpwL.cn
http://WW08IDJG.kLpwL.cn
http://n7XYRFzA.kLpwL.cn
http://www.dtcms.com/a/382637.html

相关文章:

  • 如何用 Rust 重写 SQLite 数据库(二):项目探索
  • SQLI-labs[Part 2]
  • 如何安装 Prometheus 2.20.0 for Windows(amd64 版本详细步骤)​
  • 1004:字符三角形
  • Python 生成乘法练习题:一位数乘以两位数(乘积小于100)
  • 打工人日报#20250913
  • MyBatis主键返回机制解析
  • 压缩和归档 文件传输
  • 定积分常用方法
  • AI Deepseek学习及运用
  • 重塑你的大脑:从理解突触到掌控人生
  • 19、从感知机到神经网络 - 智能的萌芽与进化
  • c++中导出函数调用约定为__stdcall类型函数并指定导出函数名称
  • [工作表控件22] 控件权限设置与字段级安全控制:业务中如何保障数据安全与合理访问
  • (LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
  • 【SPI】【一】SPI驱动入门
  • C++ `std::lock_guard` 深度解析:简约而不简单的守卫者
  • JavaScript 数组过滤方法
  • JUC(3)JMM
  • 回小县城3年了
  • 连接器上的pin针和胶芯如何快速组装?
  • String、StringBuffer 和 StringBuilder 的区别
  • 测试抽奖系统,设计测试case
  • vue的响应式原理深度解读
  • Python核心技术开发指南(061)——常用魔术方法
  • 简单概述操作系统的发展
  • 从0开始:STM32F103C8T6开发环境搭建与第一个LED闪烁
  • linux C 语言开发 (九) 进程间通讯--管道
  • LinuxC++项目开发日志——高并发内存池(5-page cache框架开发)
  • MATLAB基于组合近似模型和IPSO-GA的全焊接球阀焊接工艺参数优化研究