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

洛谷P3287 [SCOI2014] 方伯伯的玉米田 (二维树状数组+dp枚举)

原题链接

题解

难点一:区间右端点的确定

    首先,一个拔高区间的右端点一定是最右端n,接下来假设区间 [ L , R ] L>1 && R<n 我们按照左右区间情况讨论

  1、对于区间左边而言——从左边到右,区间对于左侧的区间贡献要么为 0 要么 正贡献

  2、对于区间右边而言——从区间到右边,区间拔高后,对于右侧区间的贡献要么为 0 要么 负贡献

综上区间的右端点一定是n

难点二:dp状态设计

  接下来我们设计dp状态 dp【i】【j】——以 i 为结尾,拔高 j 次的ans,转移方程为:

  dp[i][j]=max{dp[k][l]}+1(1<=k<i,0<=l<=j,h[i]+j>=h[k]+l)

   每次暴力枚举显然超时,我们考虑用二维树状数组优化——虽然树状数组只能维护不差分信息,但对于MAX信息二维树状数组我们可以查到从(1,1)到(i,j)矩形的MAX值;但仍有一个问题,就是h[i]+j>=h[k]+l 的信息怎么维护。

  我们修改二维树状数组的含义,行坐标含义——玉米下标1~i ;列坐标含义——玉米拔高后的高度即h[k]+l

剩余细节详见code

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define rept(i,a,b) for (int i=(a);i<(b);i++)
#define drep(i,a,b) for (int i=(a);i>=(b);i--)
const int N=1e4+5;
const int M=320;
const int mod=998244353;
const int INF=1e9+5;
const __int128 ONE=1;
mt19937_64 rng(time(0)); //更良好的随机数生成 范围unsigned long long 
//二维树状数组+dp枚举
int a[N];
int dp[N][505];
int tr[N][505];int lowbit(int x){return -x&x;
}
//此处取MAX这种不可差分信息是因为每次矩阵都从左上角点开始
int Query(int x,int y){y++;//y可能取到0int ans=0;for (int i=x;i>0;i-=lowbit(i)){for (int j=y;j>0;j-=lowbit(j)) ans=max(tr[i][j],ans);}return ans;
}void Add(int x,int y,int v){y++;//y可能取到0for (int i=x;i<=10000;i+=lowbit(i)){for (int j=y;j<=501;j+=lowbit(j)) tr[i][j]=max(tr[i][j],v);}
}void solve(){int n,K;cin>>n>>K;rep(i,1,n) cin>>a[i];int ans=0;rep(i,1,n){drep(j,K,0){dp[i][j]=Query(a[i]+j,j)+1;Add(a[i]+j,j,dp[i][j]);ans=max(ans,dp[i][j]);}}cout<<ans<<"\n";
}int main(){// freopen("input.txt","r",stdin);// freopen("output.txt","w",stdout);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t=1;// cin>>t;while (t--){solve();}return 0;
}

 

http://www.gsyq.cn/news/76193.html

相关文章:

  • 【SPI】SPI与QSPI异同与使用
  • 【2025年12月最新】英语四级历年真题试卷、听力音频及答案解析~PDF电子版(2015-2025年6月) - 详解
  • [容器] Podman : 一款新型的容器引擎与容器管理工具
  • 从0构建深度学习框架——揭秘深度学习框架的黑箱
  • SVPWM基础
  • 实用工具:担心腾讯ACE把你的硬盘扫坏了?用DiskGenius一分钟检测硬盘是否损坏
  • Win10最终版下载 d485系统站
  • AI元人文构想全维解读:从意义行为原生到文明共生体
  • fhq-Treap学习笔记
  • 解码常对象与运算符重载
  • 实操教程:MindSpore中确定神经网络隐藏层与输出层神经元数量
  • 一文读懂MindSpore的construct方法:神经网络的“自动流水线”
  • why North Korean are extremely anti-American, and think Nihon is a puppet of A.
  • 可变参数模版中的折叠表达式
  • scikit-learn 能否做深度学习?——兼谈不同神经元数量的模型对比实验实现
  • 深入解析USB侦探:数字取证数据流分析技术
  • 深入解析:Spring Boot 3.2 高性能架构实战:虚拟线程、原生镜像与响应式编程全解析
  • CMake-模块化
  • HELLDIVERS 2 地狱潜兵 2 缩小体积至22.54G 教程
  • Milvus GUI ATTU Docker 容器化部署指南
  • 人工神经元输入机制深度解析:从理论基础到工程实践的全面指南
  • 安卓页面的布局和生命周期(新手村第三篇) - 详解
  • 本地AI模型API网址添加到Open WebUI的方法
  • P14660 你不孤单,我们都在 题解
  • [开源项目] 蜜蜂记账 v2.2 发布:暗黑模式、标签系统、预算管理等 10+ 新功能
  • 【09】Word文档处理工具
  • 谁在主导“芯片战争”
  • 2025深圳CNC加工实力榜:金丰业五金塑胶以精密智造领跑,六家本土技术标杆企业核心优势深度解析
  • 岐金兰意义行为原生理论与AI元人文价值操作系统研究
  • 2025东莞包装材料厂家实力榜:共晟包装以可降解防静电技术领跑,八大环保纸袋品类深度解析