AtCoder Beginner Contest 335 (Sponsored by Mynavi) --- F - Hop Sugoroku -- 题解

目录

F - Hop Sugoroku

题目大意:

思路解析:

代码实现:

        


F - Hop Sugoroku

题目大意:

        

思路解析:

        容易想到这是一个dp题,然后初始转移方程为:

         如果当a[i] 较大时,时间复杂度为 O(N*N/a[i]) 接近于N,但是当a[i]为1时,时间复杂度解决O(N^2),这是不能接受的。

观察dp转移方程可以发现 (j*a[i]+i)% a[i] == i % a[i],即只有当 j % a == i % a时才能转移,这衍生出另一个dp方程 dp2[i][j],表示当前格子在t,a[t] == i, t % a[t] == j。

根据上面分析可以发现dp[i] += dp2[j][i%j],如果dp2开很大的话会爆内存空间,所以我们应该想到,当a[i] 较小时( 我取的是500) 采用dp2进行转移,如果a[i]较大则采用第一种方式进行转移。

这样的会时间开销就变为 O(N*N/500) 约等于 O(N*400)  

代码实现:

        


import java.io.*;
import java.math.BigInteger;
import java.util.*;public class Main {static int mod1 = (int) 1e9 + 7;static int mod2 = 998244353;static int BD = 500;public static void main(String[] args) throws IOException {int n = input.nextInt();int[] dp = new int[n];dp[0] = 1;int ans = 0;int[][] dp2 = new int[505][505];for (int i = 0; i < n; i++) {int a = input.nextInt();for (int j = 1; j <= BD; j++) {dp[i] = (dp[i] + dp2[j][i % j]) % mod2;}if (a <= BD){dp2[a][i % a] = (dp2[a][i%a] + dp[i]) % mod2;}else {for (int j = 1; j * a + i < n; j++) {dp[j * a + i] = (dp[j * a + i] + dp[i]) % mod2;}}}for (int i = 0; i < n; i++) {ans = (ans + dp[i]) % mod2;}out.println(ans);out.flush();out.close();br.close();}// -------------------------------- 模板 ---------------------------static boolean nextPermutation(int[] arr) {  // 排列数循环模板    记得使用 do while 循环int len = arr.length;int left = len - 2;while (left >= 0 && arr[left] >= arr[left + 1]) left--; // 从升序 一直往降序排列。if (left < 0) return false;int right = len - 1;// 找到第一个升序的位置,将其改为降序。while (arr[left] >= arr[right]) right--;{int t = arr[left];arr[left] = arr[right];arr[right] = t;}// 修改后它的前面仍然为降序,将前面全部修改为升序,这样能保证不会漏算,也不会算重left++;right = len - 1;while (left < right) {{int t = arr[left];arr[left] = arr[right];arr[right] = t;}left++;right--;}
//        System.out.println(Arrays.toString(arr));return true;}public static long qkm(long a, long b, long mod) { // 快速幂模板long res = 1;while (b > 0) {if ((b & 1) == 1) res = (res * a) % mod;a = (a * a) % mod;b >>= 1;}return res;}//    // 线段树模板
//    public static int lowbit(int x){
//        return x & (-x);
//    }
//
//    public static void bulid(int n){
//        for (int i = 1; i <= n; i++) {
//            t[i] = a[i];
//            int j = i + lowbit(i);
//            if (j<=n) t[j] += t[i];
//        }
//    }
//
//    public static void updata(int x, int val){
//        while (x <= n){
//            t[x] += val;
//            x += lowbit(x);
//        }
//    }
//
//    public static int query(int l, int r){
//        int res = 0;
//        while (l <= r){
//            res += a[r];
//            r--;
//            while (r - lowbit(r) >= l){
//                res += t[r];
//                r -= lowbit(r);
//            }
//        }
//        return res;
//    }static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static Input input = new Input(System.in);static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public String nextLine() {String str = null;try {str = reader.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return str;}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public Double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470265.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

17.JS中的object、map和weakMap

1.object和map的区别 2.weakMap和map的区别 &#xff08;1&#xff09;Map本质上就是键值对的集合&#xff0c;但是普通的Object中的键值对中的键只能是字符串。而ES6提供的Map数据结构类似于对象&#xff0c;但是它的键不限制范围&#xff0c;可以是任意类型&#xff0c;是一…

使用bpmn-js 配置颜色

本篇文章介绍如何使用bpmn-js给图例配置颜色。该示例展示了如何向BPMN图添加颜色的多种不同方法。 通过层叠设置颜色 这种方式比较简单&#xff0c;直接通过设置图片的CSS层叠样式就可实现。 .highlight-overlay {background-color: green; /* color elements as green */opa…

【算法设计与分析】反转链表 ||

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表…

Attention Is All Your Need论文翻译

0.摘要 这个统治序列转换模型是基于复杂循环或者卷积神经网络&#xff0c;它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制&#xff0c;完全免去递推和卷积。在两个机器…

代码随想录算法训练营第十七天| 110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和 (优先掌握递归)

110.平衡二叉树 刷题https://leetcode.cn/problems/balanced-binary-tree/description/文章讲解https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html视频讲解https://www.bilibili.com/video/BV1Ug411S7my/?vd_sourceaf4853e80f89e28094a5f…

Android14之Android Rust模块编译语法(一百八十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

仰暮计划|“后来经历过大饥荒,饿得吃树皮、挖野菜,天天吃不饱饭”

去姥姥家之前就给姥姥打电话说&#xff0c;要去采访姥姥&#xff0c;给她写回忆录&#xff0c;姥姥有些意外&#xff0c;开心地笑着又有些害羞。 姥姥出生于1940年&#xff0c;家中六个孩子&#xff0c;两个哥哥都是军人。姥姥小时候长得很漂亮&#xff0c;又总是生病&#xf…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

AI - 碰撞避免算法分析(ORCA)

对比VO/RVO ORCA算法检测碰撞的原理和VO/RVO基本一样的&#xff0c;只是碰撞区域的计算去掉了一定时间以外才可能发生的碰撞&#xff0c;因此碰撞区域的扇形去掉了前面的部分&#xff0c;由圆锥头变成了个圆 另一个最主要的区别是&#xff0c;求新的速度&#xff0c;是根据相…

AndroidStdio修改安卓模拟器的安装位置

AndroidStdio修改安卓模拟器的安装位置 1.删除原有的虚拟机 可以直接删除这个avd文件&#xff0c;放心大胆删除 在这个目录下可以看到.avd文件和.ini文件。.avd占了我10G.上图是我转移.avd后截的。发现这个.ini文件&#xff0c;.ini文件就是配置文件&#xff0c;就像mysql安装…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…