首页 > 其他分享 >P1880 [NOI1995] 石子合并 区间DP 记忆化DFS模拟DP

P1880 [NOI1995] 石子合并 区间DP 记忆化DFS模拟DP

时间:2024-10-17 11:09:54浏览次数:1  
标签:得分 13 210 int NOI1995 合并 P1880 DP

P1880 [NOI1995] 石子合并

诈骗题,看着像贪心,实际上是 DP

对贪心的 hack:

6
3 4 6 5 4 2
如果使用贪心法求最小得分,应该是如下的合并步骤:
第一次合并 3 4 6 5 4 2    2,3合并得分是5
    第二次合并 5 4 6 5 4      5,4合并得分是9
    第三次合并 9 6 5 4        5,4合并得分是9
    第四次合并 9 6 9          9,6合并得分是15
    第五次合并 15 9           15,9合并得分是24
    总得分=5+9+9+15+24=62
    
但是如果采用如下合并方法,却可以得到比上面得分更少的方法:
    第一次合并 3 4 6 5 4 2     3,4合并得分是7
    第二次合并 7 6 5 4 2       7,6合并得分是13
    第三次合并 13 5 4 2        4,2合并得分是6
    第四次合并 13 5 6          5,6合并得分是11
    第五次合并 13 11           13,11合并得分是24
    总得分=7+13+6+11+24=61

——by TJ-Kevin_Wa

以最小为例:

对于这个区间 DP,\(dp_{i,j}\) 表示 \([i,j]\) 中最小的花费,使用 DFS 转移,避免复杂的顺序考虑。

方程:

\[dp_{i,j} = \begin{cases} 0,i = j \\ \min_{k=i}^{j-1} dp_{i,k} + dp_{k+1,j}+\sum_{l=i}^{j}a_l\\ \end{cases} \]

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[210];
int dp1[210][210],dp2[210][210];
int ans1,ans2;
int dfs1(int l,int r){
	if(dp1[l][r])return dp1[l][r];
	if(l==r)return 0;
	int ret=2147483647;
	for(int i=l;i<r;i++){
		ret=min(ret,dfs1(l,i)+dfs1(i+1,r));
	}
	for(int i=l;i<=r;i++){
		ret+=a[i];
	}
	return dp1[l][r]=ret;
}
int dfs2(int l,int r){
	if(dp2[l][r])return dp2[l][r];
	if(l==r)return 0;
	int ret=0;
	for(int i=l;i<r;i++){
		ret=max(ret,dfs2(l,i)+dfs2(i+1,r));
	}
	for(int i=l;i<=r;i++){
		ret+=a[i];
	}
	return dp2[l][r]=ret;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		a[n+i]=a[i];
	}
	dfs1(1,2*n);
	dfs2(1,2*n);
	ans1=2147483647;
	for(int i=1;i<=n;i++){
		ans1=min(ans1,dp1[i][n+i-1]);
		ans2=max(ans2,dp2[i][n+i-1]);
	}
	cout<<ans1<<endl<<ans2;
	return 0;
}

标签:得分,13,210,int,NOI1995,合并,P1880,DP
From: https://www.cnblogs.com/UserJCY/p/18471638/jt_P1880

相关文章

  • 安防综合管理系统EasyCVR视频汇聚平台Linux环境,如何测试UDP端口是否开启?
    视频汇聚EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。平台灵活性强,支持国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石......
  • C# UDP通信 ReceiveAsync() 一直等待问题
    问题描述两个C#应用,一个作为服务端Server,另一个作为客户端Client,客户端打开一个Udp端口,循环接收数据;服务端开启后向客户端发送指令,当服务端出现异常时关闭了服务端的UdpClient,此时客户端卡死在_client.ReceiveAsync(),无法再接收到消息。客户端代码:try{varcts=newCanc......
  • 专项训练dp总结
    作者在做题的时候深感自己dp水平的低下(几近为零),于是尝试逼迫自己搞懂每道题并写一点做题记录,本质上是为了避免自己成为只会抄题解的机器。。1.[PA2021]Oddeskidodeski首先,对于一个合法的序列f,若f+x为合法序列,那么f+x+x必然也为合法序列。其次状态设计,设\(f_{i,j,0/1}\)......
  • mpls(动态) ldp 原理与配置(抓包分析)
     静态mpls配置繁琐,如果想要加一条mpls隧道,需要再整条LSP上进行配置,因此在实际配置中一般采用动态mpls。动态mpls原理静态mpls通过配置标签的出入设备,使LSR对标签达成共识。而动态mpls可以在LSR(直连或非直连)之间运行LDP(路由分发协议),使LSR自动生成标签。LDP的基本概念L......
  • 数据合并和dplyr包的介绍
    数据合并选取数据newdata<-leadship[,c(1:6)]选取了q1到q5或者vars<-c("q1","q2","q3","q4","q5")Newdata<-leadship[,vars]>print(newdata)  q1q2q3q4q51 5 4 5 5 52 3 5 2 5 53 3 5 5......
  • wordpress建站的网站提速的十五个技巧
    WordPress网站提速对于提升用户体验和搜索引擎排名至关重要。以下是一些有效的技巧来加速你的WordPress网站:选择高质量的托管服务:选择一个快速且可靠的托管服务提供商,如WPEngine、SiteGround或A2Hosting。比如www.gaiguang.com这个建站的速度就做的很棒!使用缓存插件:安装缓......
  • 每日OJ题_牛客_礼物的最大价值_路径dp_C++_Java
    目录牛客_礼物的最大价值_路径dp题目解析C++代码Java代码牛客_礼物的最大价值_路径dp礼物的最大价值_牛客题霸_牛客网(nowcoder.com)描述:        在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子......
  • WordPress WP_Query自定义搜索多个关键词
    WP_Query是 WordPress 中用于查询文章和自定义内容的核心类。它提供了强大的查询能力,允许开发者以多种方式从数据库中检索和展示内容。WP_Query支持广泛的查询参数,可以用于获取文章、页面、自定义文章类型等。所以通过WP_Query可以创建复杂的搜索功能,以便根据各种条件检索内......
  • TCP和UDP协议
    既然能查到这篇文件那说明你还是一个网路小白,本片文章会对TCP和UDP做基本介绍、优缺点对比、以及适用的场景相信读完这篇你会对TCP和UDP有充分的了解。TCP和UDP简介如果把网络模型简单划分成四层,应用层首先把数据交给传输层,传输层的传输则是基于网线或者其他介质完成的,传输层实......
  • linux 操作系统下 dpkg-preconfigure 命令介绍和使用案例
    linux操作系统下dpkg-preconfigure命令介绍和使用案例dpkg-preconfigure命令介绍dpkg-preconfigure是Debian和基于Debian的Linux发行版中用于预配置软件包的工具。它允许用户在安装软件包之前,提前提供配置选项,从而简化安装过程。命令格式dpkg-preconfigure[选......