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

石子问题(区间dp)

码蹄集OJ-石子合并

#include<bits/stdc++.h> 
using namespace std;
const int N=202;
int n,a[N],sum[N],dp[N][N];
int main( )
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];a[i+n]=a[i];}for(int i=1;i<=2*n;i++){sum[i]=sum[i-1]+a[i];}for(int i=1;i<=2*n;i++){for(int j=1;j<=2*n;j++){if(i==j){dp[i][j]=0;}else{dp[i][j]=-1e8;}}}for(int len=2;len<=n;len++){for(int i=1;i+len-1<=2*n;i++){int j=i+len-1;for(int k=i;k<j;k++){dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);}}}int result=0;for(int i=1;i<=n;i++){result=max(result,dp[i][i+n-1]);}cout<<result;return 0;
}

将数组的大小扩大一倍(即把原数组复制一份接在后面),将环形问题转换成线性问题解决。

任何环形区间的操作,都能在展开后的双倍线性数组上,通过一个连续的线性区间来表示。

定义dp[i][j]数组表示将i到j之一段石子合并成一堆时的得分。

初始化dp数组,在区间范围为0时,dp数组大小为0。由于题中求的是最小值,其他dp数组定义为无穷小。

枚举区间大小,再枚举起点,这样终点的值可以被确定。定义一个中间值k,遍历从起点到终点的所有值,得出状态转移方程:

 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);

因为在石子问题中,总值=之前的值+当前的值,当前的值是确定的,通过前面算的累加数组得到起点到终点的值sum[j]-sum[i-1]。之前的值就通过枚举中间值k来表示。

注意:因为题目是环形数组,所以结果不能直接输出dp[1][j]。应该遍历所有起点,得出的最大值才是结果。

http://www.xdnf.cn/news/15874.html

相关文章:

  • 从Prompt到结构建模:如何以数据驱动重构日本语言学校体系?以国际日本语学院为例
  • Linux:lvs集群技术
  • LVS四种工作模式深度解析
  • 千线万网,电路之行——LVS检查的内核逻辑
  • Python day18
  • 统计EfficientNet-B7的参数个数。
  • 华为擎云L420安装LocalSend
  • 单元测试学习+AI辅助单测
  • 【图像处理基石】什么是小波变换?
  • 美国VPS服务器Linux内核参数调优的实践与验证
  • iOS 通知机制及底层原理
  • 突破 MySQL 性能瓶颈:死锁分析 + 慢查询诊断 + 海量数据比对实战
  • 【设计模式C#】状态模式(用于解决解耦多种状态之间的交互)
  • 中间件安全攻防全解:从Tomcat到Weblogic反序列化漏洞介绍
  • 使用DataGrip连接安装在Linux上的Redis
  • FreeRTOS—列表和列表项
  • 相机参数的格式与作用
  • Vue3 学习教程,从入门到精通,Vue 3 声明式渲染语法指南(10)
  • 快速上手AI整合包!GPT-SoVITS-v2打包教程,解锁AIStarter应用市场潜力
  • DC-DC降压转换5.5V/3A高效率低静态同步降压转换具有自适应关断功能
  • Bicep入门篇
  • 小谈相机的学习过程
  • Linux_基础指令(一)
  • windows docker-02-docker 最常用的命令汇总
  • JMeter 元件使用详解
  • 统计学习方法的三要素
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Codeforces Round 1037 (Div. 3)(补题)
  • 前端面试专栏-工程化:27.工程化实践(CI/CD、代码规范)
  • 六种经典排序算法:从原理到 Java 实现