[SCOI2014]方伯伯的玉米田题解
[SCOI2014]方伯伯的玉米田
题目描述
方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有
输入格式
第一行包含两个整数
输出格式
输出一个整数,最多剩下的玉米数。
样例 #1
样例输入 #1
3 1
2 1 3
样例输出 #1
3
提示
思路
定义
状态转移方程:
直接暴力转移显然不行,时间复杂度
观察发现每次拔高后最长不下降子序列的长度不会减少,所以可以用二维树状数组维护
把
时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
int a[10005],f[10005][1005],n,k,maxx,_ans;
//树状数组模板
int lowbit(int x){
return x&(-x);
}
void change(int x,int y,int val){
for(int i=x;i<=maxx+k;i+=lowbit(i))
for(int j=y;j<=k+1;j+=lowbit(j))
f[i][j]=max(f[i][j],val);
}
int ask(int x,int y){
int ans=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans=max(ans,f[i][j]);
return ans;
}
//---------------
int main(){
n=read(),k=read();
for(int i=1;i<=n;i++)a[i]=read(),maxx=max(maxx,a[i]);
for(int i=1;i<=n;i++){
for(int j=k;j>=0;j--){
int t=ask(a[i]+j,j+1)+1;//找到dp[a[i]+j][j+1]
_ans=max(_ans,t);//更新答案
change(a[i]+j,j+1,t);//放入树状数组
}
}
printf("%d\n",_ans);
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/16948453.html,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】