二维dp

news/2024/10/6 3:36:18/文章来源:https://www.cnblogs.com/alohablogs/p/18251784

阿里巴巴2023092501

题目描述

在一个 ( n × n ) 的正方形训练场上,每个位置都有一枚硬币。小明从左上角 (0, 0) 出发,跳跃可以按以下方式进行:

  1. 向右走一步,再向上或向下走两步。
  2. 向右走两步,再向上或向下走一步。

小明不能跳出训练场,也不能往回跳。目标是帮助小明获得尽可能多的硬币。

输入描述

  • 第一行输入一个整数 n ( 3 ≤ n ≤ 1000 ),表示训练场的大小。
  • 接下来 n 行,每行输入 n 个整数表示每个位置的硬币数量 ( aij ) ( 1 ≤ ( aij ) ≤ 10⁹ )。

输出描述

  • 输出一个整数表示小明可以获得的最多硬币数量。

样例

输入:

3
1 1 4
5 1 4
1 9 19

输出:

14

限制:
1秒,1024KiB 内存。

思路

二维dp

1、枚举方向数组 :
dx = {1, 1, 2, 2} (向右走一步或两步)
dy = {-2, 2, -1, 1} (向上或向下走两步或一步)

2、状态方程
dp[i][j] : 跳跃到(i,j) 小明可以获得的最多硬币数量为dp[i][j]。
dp[i][j] = max(dp[i+dxi][j+dxi],dp[i][j])
3、初始化
因为dp更新方向始终向右,所以只需要初始化最左边起点,
dp[0][0] = map[0][0]
因为 0 ≤ 1 ≤ ( aij ) , 其余默认初始化为0就可以了

import java.io.*;
import java.util.*;public class Main {static int[][] map;static long[][] dp;static int[] dy = {-2, 2, -1, 1};static int[] dx = {1, 1, 2, 2};public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(reader.readLine());map = new int[n][n];for (int i = 0; i < n; i++) {String[] split = reader.readLine().split(" ");for (int j = 0; j < n; j++) {map[i][j] = Integer.parseInt(split[j]);}}dp = new long[n][n];for (long[] p : dp) Arrays.fill(p, Long.MIN_VALUE / 2);dp[0][0] = map[0][0];//外层循环应从 j = 1 开始,这样每次只会考虑向右的移动。for (int j = 1; j < n; j++) {for (int i = 0; i < n; i++) {for (int d = 0; d < 4; d++) {int nx = i - dy[d];int ny = j - dx[d];if (nx < 0 || nx >= n || ny < 0 || ny >= n) {continue;}dp[i][j] = Math.max(dp[i][j], dp[nx][ny] + map[i][j]);}}}long res = 0L;for (int i = 0; i < n; i++) {res = Math.max(res, dp[i][n - 1]);}System.out.println(res);}
}

4741魔法百合井

森林里有一口魔法井,井中有 ( L ) 朵百合花。

你可以向井里投入硬币来获取百合花:

  1. 投入 1 个硬币,可以得到 1 朵百合花。
  2. 投入 4 个硬币,记录当前篮子里的百合花数量。
  3. 投入 2 个硬币,得到上次记录数量的百合花。

如果井中百合花数量不足,投入 1 个或 2 个硬币不会有任何效果。

请计算为了获取所有百合花,所需的最少硬币数量。

输入格式

  • 第一行包含整数 ( T ),表示测试数据的组数。
  • 接下来 ( T ) 行,每行包含一个整数 ( L ),表示井中百合花的数量。

输出格式

  • 对于每组数据,输出结果格式为 Case #x: y,其中 ( x ) 为组别编号(从 1 开始),( y ) 为需要的最少硬币数量。

数据范围

  • ( 1 ≤ T ≤ 100 )
  • ( 1 ≤ L ≤ 10^5 )

输入样例

2
5
20

输出样例

Case #1: 5
Case #2: 15

样例解释

  • Case 1: 投入 5 次 1 个硬币,共 5 个硬币。
  • Case 2: 投入 5 次 1 个硬币,再投入 4 个硬币记录,然后 3 次 2 个硬币,共 15 个硬币。

思路

f[i] : 表示获得i朵百合花的最少硬币数量

状态转移方程简化

操作1

选择1可以得到状态转移方程:
f[i] = f[i-1] + 1

操作2

  1. 选择3累加上次记录的百合花。
  2. 要使用选择3,必须先使用选择2。
  3. 使用选择2后可以连续执行选择3。
  4. 设使用选择3的次数为 ( j ),选择3前的百合花数量为 ( i )。i,j∈[1,n]
  5. 使用 ( j ) 次选择3后的百合花总数为 ( (j+1) * i )。
  6. 花费的硬币数量为 ( 4 + 2 * j )。

所以状态转移方程为:

f(j+1) * i = min(f(j+1) * i, fi + 4 + 2 * j)

import java.util.*;
public class Main{static int N = (int)1e5 + 10;static int[] dp = new int[N];static {// dp[0] = 0 for (int i = 1; i < N; i++) dp[i] = 0x3f3f3f3f;for (int i = 1; i < N; i++) {dp[i] = Math.min(dp[i], dp[i - 1] + 1);for (int j = 1,  i * (j + 1); i * (j + 1) < N; j++) { dp[i * (j + 1)] = Math.min(dp[i * (j + 1)], dp[i] + 4 + 2 * j);}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);for (int i = 1, tol = sc.nextInt(); i <= tol; i++) {int n = sc.nextInt();System.out.println("Case #" + i +": " + dp[n]);}}
}

阿里巴巴淘天2023090202

定义一个“特别数组”,满足以下三个条件:

  1. 对于 1 ≤ i ≤ n,有 1 ≤ ai ≤ m
  2. 对于 1 ≤ i ≤ n,ai 是 i 的倍数。
  3. a1 + a2 + ... + an 是 n 的倍数。

给出 n 和 m,求满足条件的“特别数组”数量,对 10^9 + 7 取模。

输入描述:

两个正整数 n 和 m,用空格隔开。
1 ≤ n, m ≤ 1000

输出描述:

特别数组的数量,对 10^9 + 7 取模。

示例:

输入:

3 5

输出:

4

思路:

二维dp+枚举

f[i][j] : 前i个数的总和结果对n取模的结果为j的方案数.
1.对i个数进行枚举,1 ≤ i ≤ n;
2.对前i-1个数可能的总和(j)进行枚举,因为需要对n进行取模(j为n的倍数),所以j∈[0,n)(条件3);
3.对于第i个数ai(1 ≤ ai ≤ m),可能的值为i,2*i,...,n(条件2)
4.dp[i][(j+ai)%n] = (dp[i-1][j] + dp[i][(j+ai)%n])%(1e9+7)

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;/*** @author 17259* @create 2024-06-18 10:32*/
public class Main {static final int mod = (int) 1E9 + 7;public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] split = reader.readLine().split(" ");int n = Integer.parseInt(split[0]);int m = Integer.parseInt(split[1]);System.out.println(solve(n, m));}private static long solve(int n, int m) {long[][] dp = new long[n + 10][m + 10];dp[0][0] = 1;for (int i = 1; i <= n; i++) {// j = dp[i-1][j] : 前i-1个数总和...for (int j = 0; j < n; j++) {for (int k = i; k <= m; k += i) {dp[i][(j + k) % n] = (dp[i - 1][j] + dp[i][(j + k) % n]) % mod;}}}return dp[n][0];}
}

携程2023090704

给定一个只包含字符 '0' 和 '1' 的字符串,求该字符串中有多少个“好字串”。“好字串”的定义是其所有前缀中 '0' 的数量严格大于 '1' 的数量。

输入描述

一个只包含 '0' 和 '1' 的字符串,长度不超过 100000。

输出描述

一个整数,表示“好字串”的数量。

示例

输入

10

输出

1

说明

子区间 [2, 2] 组成的子串是一个好串。

输入

11010

输出

2
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();long res = 0;int cnt = 0;for(char ch : s.toCharArray()){if(ch == '0'){cnt++;}else{cnt = Math.max(cnt - 1, 0);}res += cnt;}System.out.println(res);}
}

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

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

相关文章

zadig 安装和使用

介绍 Zadig 是由 KodeRover 公司基于 Kubernetes 研发的自助式云原生 DevOps 平台,源码 100% 开放。Zadig 提供灵活可扩展的工作流支持、多种发布策略编排以及一键安全审核等特性。该平台还支持定制的企业级 XOps 敏捷效能看板,深度集成多种企业级平台,并通过项目模板化批量…

将jar可执行文件打包为windows安装包体

当我们希望将java编写的可执行文件.jar打包为一个.exe供用户直接使用,我们需要将jre/jdk也打包到exe中,这样用户环境就不需要安装jdk,直接运行我们做好的exe文件。 整个过程分为两步,为了方便演示,这里使用JMonkeyEngine SDK打包一个jme3游戏的方式来解释。 工具 首先下载…

FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt

​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。 其中SRT全称为Secure Reliable Transport,中文叫做安全可靠传输协议。RIST全称…

java学习进度

(1)通过视频学习了解了java基本概述 (2)成功下载了Eclipse,并搭建java环境 (3)使用Eclipse运行"hello world"程序 代码如下: package hello; public class helloworld { public static void main(String[] args) {// TODO Auto-generated method stubSystem.…

横截面交易策略:概念与示例

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 什么是横截面策略 横截面交易策略(Cross-Sectional Trading Strategy)是一种金融市场上的交易策略,它是基于不同资产之间的相对价值或其他因子的差异来进行投资决策。这种策略的核…

Spark快速大数据分析PDF下载读书分享推荐

《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的核心概念和基本原理也有较为全面的介绍,让读者能够知其然且知其所以然。 Spark快速大数据分析PDF下载…

IP核:XDMA学习

知识: XDMA效率没有RIFFA高,最高似乎只支持1288位宽; 输出的用户时钟是250MHZ; IP核配置: 参考: https://docs.amd.com/r/zh-CN/pg195-pcie-dma/ 具体:重要:PCIe:BARs标签页该标签页主要用于配置 BAR,所谓的使能和配置各接口 interface,其实质是配置不同的 BAR,首先介…

【模块三】Python高级

面向对象基础 类和对象 概念 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式。 类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。 面向对象编程提供了一种从现实世界中抽象…

大气热力学(5)——绝热过程

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录5.1 气块的概念5.2 热力学第一定律的几种微分形式5.3 干绝热过程5.4 干绝热递减率(干绝热直…

如何解决服务器开机报警问题

解决服务器开机报警问题,需要按照一系列步骤进行故障排查和修复。 一、初步检查与确认 查看报警信息: 观察服务器的指示灯,特别是电源指示灯、硬盘指示灯等,看是否有异常。 如果服务器有显示屏或终端窗口,查看是否有相应的警告信息或错误代码。 确认电源状态: 检查电源线…

用友财务软件数据库恢复

是一个关键的操作,旨在解决数据库文件损坏或数据丢失的问题。 一、恢复方法使用软件内置的数据恢复工具 步骤: 打开用友财务软件,进入“工具”或“数据管理”等相关菜单。 找到“数据库恢复”或“数据恢复”选项,点击进入。 选择需要恢复的数据库文件和备份文件。这里需要确…

管家婆数据库数据恢复

一、确认数据丢失情况 首先,需要确认数据是否真的丢失,以及丢失的数据范围。有时候,数据可能只是暂时无法访问,或者由于软件故障导致的数据显示问题。 二、检查备份定期备份的重要性 管家婆软件通常会具备自动备份功能,用户应该确保该功能已经开启,并定期检查备份文件的完…