首页 > 其他分享 >[SCOI2014] 方伯伯的玉米田(树状数组优化 DP)

[SCOI2014] 方伯伯的玉米田(树状数组优化 DP)

时间:2024-10-31 18:50:18浏览次数:7  
标签:树状 int res 玉米田 端点 lowbit 序列 SCOI2014 DP

 loj 传送门icon-default.png?t=O83Ahttps://loj.ac/p/2211

洛谷题目传送门icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P3287

解题思路

首先,我们可以贪心地思考一下:对于每一次区间的加一操作,右端点是在末尾会比右端点在中间的情况更好。

因为,当你的右端点在序列中间的时候,相对之下,后面的数就更小了一些,这样是不利于形成上升序列的。

所以,每次的操作右端点应该在末尾,即区间为 [l,n]

然后,定义 DP 状态,设 f(i,j) 表示前 i 个数,进行了 j 次操作,每次操作的左端点都在 i 之前的最大上升序列长度。

然后考虑如何转移。a_i+j

首先,从 i 前找一个点 x(x<i),然后枚举这个操作次数 y,可以得到这个转移方程:

f(i,j)=\max(f(x,y)+1)

其中,x,y 应满足 x<i,y<=j,a_x+y<=a_i+j,(其中 a_i 表示序列的第 i 项的值)。

但是,这样的转移是 O(n^2k^2) 的,那是包会超时的好吧。

所以,我们要考虑优化一下。

我们可以观察转移的范围,x<i,y<=j,a_x+y<=a_i+j,我们对这个范围内的 f(x,y) 取的是最大值。

想想,有什么数据结构可以维护这样范围内的最大值?

对,就是(二维)树状数组

于是,我们可以将第一维表示次数 j,第二维表示 a_i+j,这样就可以快速求这个范围内的最大值了。

时间复杂度 O(nk \log (a_i+j) \log k)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int a[10001];
int tr[601][5601];
int f[10001][601];
int lowbit(int x)
{
	return x&(-x);
}
int query(int x,int y)
{
	int res=0;
	for(int i=x;i>0;i-=lowbit(i))
	{
		for(int j=y;j>0;j-=lowbit(j))
		{
			res=max(res,tr[i][j]);
		}
	}
	return res;
}
void change(int x,int y,int d)
{
	for(int i=x;i<=k+1;i+=lowbit(i))
	{
		for(int j=y;j<=5500;j+=lowbit(j))
		{
			tr[i][j]=max(tr[i][j],d);
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=k;j>=0;j--)//要倒序,避免重复 
		{
			f[i][j]=query(j+1,a[i]+j)+1;
			change(j+1,a[i]+j,f[i][j]);//j可以为0,但是树状数组不行,于是+1处理 
		}
	}
	
	cout<<query(k+1,5500);
	return 0;
}

标签:树状,int,res,玉米田,端点,lowbit,序列,SCOI2014,DP
From: https://blog.csdn.net/2403_87021226/article/details/143370439

相关文章

  • 决策单调性优化 DP
    前言本文将介绍决策单调性优化DP的相关内容。持续更新修正,如有差错请指出。1.四边形不等式优化1.1四边形不等式与决策单调性四边形不等式:如果对于任意的\(a\leb\lec\led\)均成立\[w(a,d)+w(b,c)\gew(a,c)+w(b,d)\]则称代价函数\(w\)满足四边形不等式。......
  • 线程池ThreadPoolExecutor配合callable获得线程执行结果
    此处记录使用callable创建线程,使用线程池执行,看下是否有进行线程复用并且FutureTask返回结果线程创建publicclassMyCallableBakeUserimplementsCallable<String>{privateinta;publicMyCallableBakeUser(inta){this.a=a;}@Overrid......
  • 使用ThreadPoolExecutor线程池消化线程执行代码
    此处记录一个使用ThreadPoolExecutor线程池的demo线程代码publicclassExcutorRunnableimplementsRunnable{@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+":线程执行666");try{Thread.......
  • TCP和UDP
    TCP(传输控制协议)连接导向:在数据传输之前,TCP需要建立连接(如三次握手),确保双方可以通信。可靠性:TCP提供数据传输的可靠性,确保数据包按顺序到达,且没有丢失。丢失的数据包会被重传。流量控制和拥塞控制:TCP具有流量控制机制,防止发送方过快发送数据,导致接收方处理不过来。同时,它也会根......
  • ​Leetcode 166.珠宝的最高价值​ 网格图dp C++实现
    问题:Leetcode166.珠宝的最高价值现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:只能从架子的左上角开始拿珠宝每次可以移动到右侧或下侧的相邻位置到达珠宝架子的右下角时,停止拿取注意:珠宝的价值都是大于0的。除非这个......
  • 大盗阿福(线性DP)
    一、递归写法(dfs深搜)#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;constintN=507;inthome[N],mem[N];intn;intdfs(intx){if(x>n)return0;returnmax(dfs(x+1),dfs(x+2)+home[x]);//不选......
  • dpdk环境搭建
    系统配置ubuntu22.04dpdk21.11修改grub配置sudovim/etc/default/grub这里是进行配置大页内存,在修改之前需要查看自己机器的配置,根据自己的机器配置进行修改等等GRUB_CMDLINE_LINUX="intel_iommu=oniommu=ptvfio_pci.enable_sriov=1vfio_pci.disable_idle_d3=1us......
  • 本地搭建AI证件照神器HivisionIDPhotos轻松自己在线制作证件照
    文章目录前言1.安装Docker2.本地部署HivisionIDPhotos3.简单使用介绍4.公网远程访问制作照片4.1内网穿透工具安装4.2创建远程连接公网地址5.配置固定公网地址前言本文主要介绍如何在Linux系统使用Docker快速部署一个AI证件照工具HivisionIDPhotos,并结合cpol......
  • 【重磅新品】芯驿电子 ALINX 推出全新 IP 核产品线,覆盖 TCP/UDP/NVMe AXI IP 核
    在创新加速的浪潮中,为更好地响应客户群需求,芯驿电子ALINX推出全新IP核产品线,致力于为高性能数据传输和复杂计算需求提供高带宽、低延迟的解决方案。发布的第一批IP核包括10GBe/40GBeUDP协议栈IP核、10GbETCP/IP协议栈IP核和NVMeAXIIP核。 ALINX发布的10Gb......
  • 2024年国际关系、外交学与政治学国际学术会议(ICIEDPS 2024)
    2024年国际关系、外交学与政治学国际学术会议(ICIEDPS2024)2024InternationalConferenceonInternationalRelations,DiplomacyandPoliticalScience(ICIEDPS2024)会议信息大会官网:2024年国际关系、外交学与政治学国际学术会议(ICIEDPS2024)投稿邮箱:[email protected]......