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

手机网站设计只找亿企邦360地图怎么添加商户

手机网站设计只找亿企邦,360地图怎么添加商户,网站建设与管理感想,微分销是什么意思终于有时间来慢慢补补题了 J Qu’est-ce Que C’est? 作为队内的dp手,赛时想了好久,等学弟学妹都出了还是不会,羞愧,还好最终队友做出来了。 链接J Qu’est-ce Que C’est? 题意 长度为 n n n 的数组 a a a,每…

终于有时间来慢慢补补题了

J Qu’est-ce Que C’est?

作为队内的dp手,赛时想了好久,等学弟学妹都出了还是不会,羞愧,还好最终队友做出来了。
链接J Qu’est-ce Que C’est?

题意

长度为 n n n 的数组 a a a,每个数的取值范围 a i = [ − m , m ] a_i = [-m, m] ai=[m,m],问所有满足长度 > 1 >1 >1 的子段的和为非负数的数组可能的数量。 1 ≤ n , m ≤ 5000 1\leq n,m\leq 5000 1n,m5000

思路

看了懵哥的题解,看到状态定义后就会了,我怎么就想不到呢?
法一
dp状态定义 f [ i ] [ j ] : f[i][j]: f[i][j]: i i i 个数,最小后缀和为 j j j 的方案数 j = [ − 5000 , 5000 ] j = [-5000, 5000] j=[5000,5000]。因为是最小后缀和,那么如果有后缀 < − 5000 <-5000 <5000 的说明至少是两个数以上的和为负数,与题意不符是不合法的方案,所以数组大小开到 [ 0 , 10000 ] [0,10000] [0,10000] 即可(离散化后)。

我们先不管时间复杂度,根据dp定义先敲个状态转移出来,代码如下:

#include <bits/stdc++.h>
using namespace std;#define ll long longconst int N = 5010, mod = 998244353;int f[N][N * 2]; // 前i个数,最小后缀和为j的方案数 j = [-5000, 5000]void add(int& a, int b){a = (a + b) % mod;
}
int main(){int n, m;cin >> n >> m;f[0][2 * m] = 1;for(int i = 1; i <= n; i ++){for(int j = -m; j <= m; j ++){ // 枚举最小后缀for(int k = m; k >= -m; k --){ // 枚举当前a_i选哪个数if(j + k < 0) break;add(f[i][min(j + k, k) + m], f[i - 1][j + m]);}}}int ans = 0;for(int i = -m; i <= m; i ++){add(ans, f[n][i + m]);}cout << ans;return 0;
}

时间复杂度为 O ( n 3 ) O(n^3) O(n3),我们观察一下代码如何优化,发现会有大量连续的 k k k f [ i ] [ min ⁡ ( j + k , k ) ] f[i][\min(j + k, k)] f[i][min(j+k,k)] 加的是同一个状态 f [ i − 1 ] [ j ] f[i - 1][j] f[i1][j]。那么经典优化方案不就来了吗,差分前缀和优化。

以下分情况讨论:
因为是 min ⁡ ( j + k , k ) \min(j + k, k) min(j+k,k)

  1. j j j 是非正数
    无论当前 k k k 选什么, j + k ≤ k j + k \leq k j+kk,所以状态一定是转移到 j + k j + k j+k,所以对于一个非正数的 j j j 可转移的范围就是 0 ∼ j + m 0 \sim j + m 0j+m
// 区间 [l, r] + val  f_l + val  f_{r + 1} + val
for(int j = -m; j <= 0; j ++){f[i][m] = (f[i][m] + f[i - 1][j + m]) % mod;// 差分 +f[i][m + j + m + 1] = (f[i][m + j + m + 1] + mod - f[i - 1][j + m]) % mod;// 差分 -
}
  1. j j j 是正数
    同理无论当前 k k k 选什么, k ≤ j + k k \leq j + k kj+k,所以状态一定是转移到 k k k,所以对于一个正数 j j j,可以转移的范围就是 − j ∼ m -j\sim m jm
for(int j = 1; j <= m; j ++){f[i][-j + m] = (f[i][-j + m] + f[i - 1][j + m]) % mod;f[i][m + m + 1] = (f[i][m + m + 1] + mod - f[i - 1][j + m]) % mod;
}

完整代码

#include <bits/stdc++.h>
using namespace std;#define ll long longconst int N = 5010, mod = 998244353;int f[N][N * 2]; // 前i个数,最小后缀和为j的方案数 j = [-5000, 5000]void add(int& a, int b){a = (a + b) % mod;
}
int main(){int n, m;cin >> n >> m;f[0][2 * m] = 1;for(int i = 1; i <= n; i ++){/*for(int j = -m; j <= m; j ++){for(int k = m; k >= -m; k --){if(j + k < 0) break;add(f[i][min(j + k, k) + m], f[i - 1][j + m]);}}*/// 考虑差分前缀和优化// j 是 负数 k 是正数 f[i][j + k + m] 从0 ~ m + j// j 是 正数 k 是负数/正数 f[i][k + m] 从-j ~ mfor(int j = -m; j <= 0; j ++){f[i][m] = (f[i][m] + f[i - 1][j + m]) % mod; // 差分 +f[i][m + j + m + 1] = (f[i][m + j + m + 1] + mod - f[i - 1][j + m]) % mod; // 差分 -}for(int j = 1; j <= m; j ++){f[i][-j + m] = (f[i][-j + m] + f[i - 1][j + m]) % mod;f[i][m + m + 1] = (f[i][m + m + 1] + mod - f[i - 1][j + m]) % mod;}for(int j = -m + 1; j <= m; j ++){ // 前缀和f[i][j + m] = (f[i][j + m] + f[i][j + m - 1]) % mod;}}int ans = 0;for(int i = -m; i <= m; i ++){add(ans, f[n][i + m]);}cout << ans;return 0;
}
http://www.ahscrl.com/news/274.html

相关文章:

  • 网站移动端的设计思想百度关键词搜索量统计
  • 优惠券精选网站怎么做西安网络科技公司排名
  • 手机怎么做网站教程徐州seo建站
  • 昆山高端网站建设苏州推广排名
  • 十堰专业网站建设商业软文代写
  • 深圳手机网站建设多少钱推广网站有哪些
  • 学网站开发去哪学网站优化推广教程
  • 做会计题目的网站百度总部公司地址在哪里
  • 大连哪个企业想做网站软件开发公司经营范围
  • 网站搜索条怎么做推广网站要注意什么
  • dede 网站名称不显示怎样制作一个网站
  • 水利建筑工程网站seo整站优化什么价格
  • 深圳做义工的网站做网站需要多少钱
  • 南阳做网站多少电话北京做网页的公司
  • 订制企业网站灰色词排名代做
  • 个人网站设计报告书论坛seo招聘
  • 怎么修改网页上的内容西安关键词优化软件
  • wordpress 图片 cdn济南搜索引擎优化网站
  • 企业网站做百度排名要怎么做网站优化方案设计
  • 苏州制作网站的公司哪家好青岛seo关键字排名
  • 用php做网站流程拉人头最暴利的app
  • 桐乡市建设局网站大通酩悦网站优化排名金苹果系统
  • 微信怎么制作微电影网站seo外链怎么做
  • 湖北省疾病预防控制中心官方网站seo做得比较好的企业案例
  • 搭建网站是seo的入门seo搜索引擎优化排名报价
  • 付公司网站费用怎么做分录站长工具seo综合
  • 天河网站+建设信科网络网络营销案例题
  • 怎么给网站做301湘潭网站设计
  • 苏州微网站建设淘宝关键词优化技巧
  • wordpress 浮窗播放器网站排名优化服务