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

前端电商网站设计论文seo引擎优化教程

前端电商网站设计论文,seo引擎优化教程,做机械设计兼职的网站,wordpress申请adsense题目内容 原题链接 给定一个长度为 n n n 的数组 n u m s nums nums 和一个区间左右端点 [ l , r ] [l,r] [l,r] 。 返回 n u m s nums nums 中子多重集合的和在闭区间 [ l , r ] [l, r] [l,r] 之间的 子多重集合的数目 。 子多重集合 指的是从数组中选出一些元素构成的 …

题目内容

原题链接

给定一个长度为 n n n 的数组 n u m s nums nums 和一个区间左右端点 [ l , r ] [l,r] [l,r]
返回 n u m s nums nums 中子多重集合的和在闭区间 [ l , r ] [l, r] [l,r] 之间的 子多重集合的数目 。

子多重集合 指的是从数组中选出一些元素构成的 无序 集合,每个元素 x x x 出现的次数可以是 0 , 1 , . . . , o c c [ x ] 0, 1, ..., occ[x] 0,1,...,occ[x] 次,其中 o c c [ x ] occ[x] occ[x] 是元素 x x x 在数组中的出现次数。

注意:

  • 如果两个子多重集合中的元素排序后一模一样,那么它们两个是相同的子多重集合 。
  • 空集合的和是 0 。

数据范围

  • 1 ≤ n ≤ 2 ⋅ 1 0 4 1\leq n\leq 2\cdot 10^4 1n2104
  • 0 ≤ n u m s [ i ] ≤ 2 ⋅ 1 0 4 , s u m ( n u m s ) ≤ 2 ⋅ 1 0 4 0\leq nums[i]\leq 2\cdot 10^4, sum(nums)\leq 2\cdot 10^4 0nums[i]2104,sum(nums)2104
  • 0 ≤ l ≤ r ≤ 2 ⋅ 1 0 4 0\leq l\leq r\leq 2\cdot 10^4 0lr2104

题解

本题从数据范围出发。

考虑 n u m s nums nums 总和不超过 20000 20000 20000 ,那么 n u m s nums nums 中不同的数有多少个呢?

考虑最小的情况下有 x x x 种数,每种数一个,那么总和为: x × ( x + 1 ) 2 \frac{x\times (x+1)}{2} 2x×(x+1)
x = 200 x=200 x=200 时, x × ( x + 1 ) 2 = 20100 > 20000 \frac{x\times (x+1)}{2}=20100>20000 2x×(x+1)=20100>20000 ,故至多有 199 199 199 个不同的数。

那么问题转换为一个分组背包问题,值为 v v v 的数的个数有 c c c 个,那么可以选择这个数 [ 0 , v ] [0,v] [0,v] 次,这样可以转换成 01 01 01 背包,最多有 O ( n ) O(n) O(n) 个物品。

这样时间复杂度为: O ( n ∑ n u m s ) O(n\sum nums) O(nnums) 4 e 8 4e8 4e8 不能通过。

考虑从定义出发:
d p [ i ] [ j ] dp[i][j] dp[i][j] 表示前 i i i 种物品,容量使用为 j j j 的方案数。
那么 d p [ i ] [ j ] dp[i][j] dp[i][j] 的状态转移方程是什么呢?

d p [ i ] [ j ] = ∑ k d p [ i − 1 ] [ k ] dp[i][j]=\sum\limits_{k} dp[i-1][k] dp[i][j]=kdp[i1][k] ,满足 0 ≤ j − k ≤ c n t [ i ] × v a l [ i ] 0\leq j-k\leq cnt[i]\times val[i] 0jkcnt[i]×val[i]

其中 c n t [ i ] cnt[i] cnt[i] 表示第 i i i 个数的数量, v a l [ i ] val[i] val[i] 表示第 i i i 个数的值。

那么就是要求一个区间和了。

麻烦在于如果二维转移,时间复杂度还是 O ( n ∑ n u m s ) O(n\sum nums) O(nnums)

这里具体的实现是,先用完全背包计算前缀和,然后最多考虑每个数的次数 c n t [ i ] cnt[i] cnt[i] 次。

def func():dp = [0] * (r + 1)dp[0] = 1nums_cnt// 枚举每个数及其次数for v, c in nums_cnt;for i in range(x, r + 1):dp[i] += dp[i - 1]// 这样 dp[i] 就是考虑有 0 个,1 个,... i/v 个数 v 的集合// 做完了前缀和// 但是需要注意的是,数的数量只有 c 个// 所以我们还需要多的部分for i in range(r + 1, (c + 1) * v - 1, -1):// dp[i] 只能由 dp[i], dp[i-v], dp[i-2v], ..., dp[i-cv] // 转移而来,所以对于 dp[i-(c+1)*v]存储的是 i-(c+1)*v 的前缀和,// 其并不能转移到 dp[i] ,删去即可dp[i] -= dp[i-(c + 1) * v]// 最后考虑 0 选择即可,有 zero + 1 种选法return (nums_cnt[0] + 1) * sum(dp[l:r+1])

时间复杂度: O ( 200 ∑ n u m s ) O(200\sum nums) O(200nums)

代码

class Solution {
public:int countSubMultisets(vector<int>& nums, int l, int r) {const int MAX = 20010;const int MOD = 1e9 + 7;vector<int> dp(r + 1);dp[0] = 1;vector<int> cnt(MAX);vector<int> vec;int zero = 0;for (int u: nums) {if (u == 0) {zero += 1;continue;}cnt[u] += 1;if (cnt[u] == 1) vec.push_back(u);}for (int u: vec) {for (int i = u; i <= r; ++i) {dp[i] += dp[i - u];if (dp[i] >= MOD) dp[i] -= MOD;}int l = (cnt[u] + 1) * u;for (int i = r; i >= l; --i) {dp[i] -= dp[i - l];if (dp[i] < 0) dp[i] += MOD;}}int ans = 0;for (int i = l; i <= r; ++i) {ans += dp[i];if (ans >= MOD) ans -= MOD;}ans = 1ll * ans * (zero + 1) % MOD;return ans;}
};
http://www.15wanjia.com/news/32138.html

相关文章:

  • 中国网站制作公司it培训机构培训费用
  • 万江仿做网站网站建设公司哪家好?该如何选择
  • 常见的动态网站开发技术有哪些免费的网站推广在线推广
  • 安徽网站建设有限公司无限制搜索引擎排名
  • 怎么做二手房网站如何建造自己的网站
  • 企业网站建设的原则包括自动友链网
  • 江西建设厅网站证书查询江门网站开发多少钱
  • 网站收录量低怎么做磁力猫torrentkitty官网
  • 网站建设的条件域名被墙检测
  • 怎么上传做 好的网站怎么查询最新网站
  • 北京都有哪些公司名称关键词优化百家号
  • 做网站还要维护吗百度智能小程序怎么优化排名
  • 网站手机模板的特点网络推广seo公司
  • 手机制作网站百度广告投放收费标准
  • 网站如何做301重定向百度手机助手免费下载
  • 网站设计模板源码搜索引擎推广成功的案例
  • 网站标题logo制作百度24小时人工客服
  • 成都定制企业网站制作杭州百度快照优化公司
  • 做静态网站软件搜索引擎优化的基本内容
  • mysql做网站怎么查看数据网络推广平台有哪些公司
  • 网站 网安备案查询什么推广平台比较好
  • 辽宁省建设工程信息网出问题了跨境电商seo是什么意思
  • 织梦网站转移福州seo排名优化
  • 女性做网站seo链接优化
  • 红月私服网站怎么做厦门seo优化公司
  • web做花店网站页面沈阳网站seo公司
  • 购物网站常用的多组图左右轮播的js图片特效代码网络营销的传播手段
  • 网站小编可以在家做吗seo计费怎么刷关键词的
  • 昆明企业建站模板短链接在线生成官网
  • 做网站资料准备什么百度提交入口网址是什么