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

网站防护找谁做网站查询服务器

网站防护找谁做,网站查询服务器,武汉做网站开发的公司,陕西做网站公司哪家好目录 1.定义 2.作用 3.例题:【模板】一维前缀和 分析 方法1:暴力解法 方法2:前缀和(简单的动态规划) 第一步:预处理 4.练习:P1115 最大子段和 分析 方法1:段长从1枚举到n 方法2:改进方法1 代码 提交结果 1.定义 快速求出数组中某一段的区间和,时间复杂度为(速度极…

目录

1.定义

2.作用

3.例题:【模板】一维前缀和

分析

方法1:暴力解法

方法2:前缀和(简单的动态规划)

第一步:预处理

4.练习:P1115 最大子段和

分析

方法1:段长从1枚举到n

方法2:改进方法1

代码

 提交结果


1.定义

快速求出数组中某一段的区间和,时间复杂度为O(1)(速度极快)

2.作用

可在暴力枚举的过程中快速给出查询的结果,用空间替换时间,从而优化时间复杂度

3.例题:【模板】一维前缀和

https://ac.nowcoder.com/acm/problem/226282

分析

注意到数组从下标为1位置开始计数,原因见之后的算法推导

方法1:暴力解法

直接的想法:先用arr[]存读到的数,读到l和r时就按部就班地计算arr[l]+arr[l+1]+...+arr[r]

注意使用long long存储求和的结果,用int可能会溢出

#include <iostream>
#define endl "\n"
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,q,l,r;const long long N=1e5+10; long long arr[N];cin>>n>>q;for (int i=1;i<=n;i++)cin>>arr[i];while(q--){long long sum=0;cin>>l>>r;for (int j=l;j<=r;j++)sum+=arr[j];cout<<sum<<endl;	} 
}

运行结果:运行超时

反思:时间复杂度按最差情况算,如果每次都要计算arr[1]~arr[n]的和,时间复杂度为O(q\cdot N)(q为询问次数

方法2:前缀和(简单的动态规划)

第一步:预处理

预处理一个数组dp[],其中元素dp[i]表示arr[1]+...+arr[i]的求和结果(即闭区间[1,i]中所有元素的和)

使用递推公式dp[i]=dp[i-1]+dp[i]来快速预处理,时间复杂度为O(N),而若每次计算f[i]都有反复计算arr[1]+...+arr[i],时间复杂度为O(N^2)

★则arr[l]+...+arr[r]等于dp[r]-dp[l-1]

设计代码时,在读arr[i]时就可以预处理前缀和数组

即如果用S_nb表示数组的前n项和,其中S_1=a_1,那么有S_n-S_{n-1}=a_n(n>=2)(这个就是状态转移方程,等价表示为dp[i]=dp[i-1]+arr[i]),可以使用数组dp[N]来存储所有的S_i(1<=i<=n)

#include <iostream>
#define endl "\n"
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,q,l,r;const long long N=1e5+10; long long arr[N];long long dp[N];cin>>n>>q;cin>>arr[1];//注意从下标为1开始计数dp[1]=arr[1];for (int i=2;i<=n;i++){//一边读arr[i],一边写入dp数组cin>>arr[i];dp[i]=dp[i-1]+arr[i];}while(q--){cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;	} 
}

(注意从下标从1开始计数,这样好处理,从0开始容易越界访问,例如[0,2]区间的元素的和:dp[2]-dp[-1],-1越界了,设置dp[0]=0,不干扰计算结果) 

若i从1开始循环,前缀和计算代码也可以这样写:

	dp[0]=0;cin>>n;for (int i=1;i<=n;i++){cin>>arr[i];//i==1时,dp[i-1]==dp[0]dp[i]=dp[i-1]+arr[i];}

运行结果:

4.练习:P1115 最大子段和

https://www.luogu.com.cn/problem/P1115

分析

读题可知:"使得这段和最大"应该使用前缀和算法

方法1:段长从1枚举到n

#include <iostream>
#include <climits>
#define endl "\n"
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;const long long N=2e5+10; long long arr[N];long long dp[N];long long max=LLONG_MIN; cin>>n;cin>>arr[1];dp[1]=arr[1];for (int i=2;i<=n;i++){cin>>arr[i];dp[i]=dp[i-1]+arr[i];}for (int len=1;len<=n;len++)//段长从1枚举到n{for (int index=1;index+len-1<=n;index++){long long sub=dp[index+len-1]-dp[index-1];if (sub>max)max=sub;}} cout<<max;
}

注:long long的最小值的宏为LLONG_MIN,定义在头文件<climits>中

运行结果:超时,算法需要改进,两层for循环时间复杂度过高

方法2:改进方法1

算法:

设数组arr存储读入的n个元素,求以元素arr[i]为结尾的最大子段和,可以画图演示计算方法

则以元素arr[i]为结尾的子段和为dp[i]-dp[x],如果要求子段和最大,那么有:

(dp[i]-dp[x])_{max}=dp[i]-dp[x]_{min}

(注:设i为常数)

定义(dp[i]-dp[x])_{max}为ret,dp[x]_{min}为prevmin,显然,求最大使用max函数,求最小使用min函数

暂时写为:

ret=max(?,ret);
prevmin=min(?,prevmin);

填补?处:

(dp[i]-dp[x])_{max}=dp[i]-dp[x]_{min}=dp[i]-prevmin

由于i从1开始因此一开始ret==max(dp[1]-prevmin,ret)==dp[1],那么prevmin的初始值为0(max(dp[1]-prevmin,ret)为max(dp[1],ret)),则可以写出:

ret=max(dp[i]-prevmin,ret);
prevmin=min(dp[i],prevmin);

代码

#include <iostream>
#include <algorithm>
#define endl "\n"
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,tmp;long long dp[200005];long long prevmin=0,ret=-1e5-10;//ret初始化为负无穷大 cin>>n;dp[0]=0;for (int i=1;i<=n;i++){cin>>tmp;dp[i]=dp[i-1]+tmp;//arr数组可以省略,下面没有用到 }for (int i=1;i<=n;i++) {ret=max(dp[i]-prevmin,ret);prevmin=min(prevmin,dp[i]);}cout<<ret;
}

 提交结果

http://www.dtcms.com/wzjs/301455.html

相关文章:

  • 宁波最新消息今天临沂seo全网营销
  • 用ssh做的网站百度seo优化分析
  • 长沙网站制作的站长统计网站统计
  • 单页面网站设计网站欣赏私人浏览器
  • 网站建设智能小程序橘子seo历史查询
  • 学做网站需要多久时间湖南百度推广代理商
  • 合肥长丰路网站建设网站建设总结
  • 莘县网站定制宁波seo软件
  • 电商平台网站制作费用2022年新闻热点事件
  • 动漫设计制作专业学什么seo基础入门
  • 东莞商城网站建设新闻稿发布软文平台
  • 桂林网站优化选择桂林速优网络公司营销方式和渠道有哪些
  • 湘潭网站优化网络营销有哪些推广方法
  • 百丽优购物官方网站百度推广如何代理加盟
  • 那个网站是做批发的个人网站制作多少钱
  • 免费企业建站系统排名2022双11各大电商平台销售数据
  • 孝感市城乡建设委员会网站百度指数如何分析
  • 深圳好的网站建设公司哪家好搜索引擎的工作原理有哪些
  • 网站建设水平如何评价合肥seo推广外包
  • 网站优化有哪些类型公众号seo排名优化
  • 企业网站建设公司中文网站排行榜
  • 平湖市规划建设局网站seo北京优化
  • 温州专业建站百度搜索引擎网址格式
  • 黄埔做网站的公网络推广服务外包
  • 中国建设新闻网站网站备案查询工信部官网
  • 爱心捐赠网站怎么做微信营销软件手机版
  • 手机社交网站建设万网域名注册教程
  • 快乐十分网站开发网站站内推广怎么做
  • 重庆时时彩做号网站域名被墙查询
  • 手机网站免费建站百度sem认证