2.11

news/2025/2/11 22:52:03/文章来源:https://www.cnblogs.com/Mikkeykarl/p/18710631

2.11

P1775 石子合并(弱化版) - 洛谷 (luogu.com.cn)

  • 可以说是区间dp入门的基本题目了

  • 状态数组\(dp[i][j]\)为区间i到j合并后的消耗最小值

  • 那么我们只需要枚举区间长度,区间起点(区间末可以通过前面两个算出),再枚举区间中间的隔断点,即可得出最大值

  • 我们用前缀和来维护我们合并时的损耗

import java.io.*;
import java.util.*;public class Main implements Runnable {static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));//static Scanner cin = new Scanner(System.in);static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));static int n;static final int N = (int) (3e2 + 10);static int[][] dp = new int[N][N];static int[] sum = new int[N];public static void main(String[] args) {new Thread(null, new Main(), "", 1 << 29).start();}public static int nextInt() throws IOException {cin.nextToken();return (int) cin.nval;}//    public static String next() throws IOException {
//        return cin.next();
//    }@Overridepublic void run() {try {n = nextInt();for (int i = 1; i <= n; i++) {Arrays.fill(dp[i], 0x3f3f3f3f);}for (int i = 1; i <= n; i++) {int x = nextInt();dp[i][i] = 0;sum[i] = sum[i - 1] + x;}for (int len = 2; len <= n; len++) {for (int start = 1; start + len - 1 <= n; start++) {int end = start + len - 1;for (int k = start; k < end; k++) {dp[start][end] = Math.min(dp[start][end], dp[start][k] + dp[k + 1][end] + sum[end] - sum[start - 1]);}}}cout.println(dp[1][n]);cout.flush();} catch (IOException e) {throw new RuntimeException(e);}}}

[P1880 NOI1995] 石子合并 - 洛谷 (luogu.com.cn)

  • 本题变式为环,其实本质和上题没有区别
  • 我们只需要将数组连接成两个数组,例如数组\([1, 2, 3, 4]\)变为数组\([1,2,3,4,1,2,3,4]\)我们会发现在维持长度\(len<=n\)时,其区间是符合其为环的情况的
  • 所以只需要枚举起点时由\(n->2n\)即可
import java.io.*;
import java.util.*;public class Main implements Runnable {static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));//static Scanner cin = new Scanner(System.in);static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));static int n;static final int N = (int) (1e2 + 10);static int[][] dp = new int[N * 2][N * 2];static int[][] dp_ = new int[N * 2][N * 2];static int[] sum = new int[N * 2];static int[] arr = new int[N * 2];public static void main(String[] args) {new Thread(null, new Main(), "", 1 << 29).start();}public static int nextInt() throws IOException {cin.nextToken();return (int) cin.nval;}//    public static String next() throws IOException {
//        return cin.next();
//    }@Overridepublic void run() {try {n = nextInt();for (int i = 1; i <= n * 2; i++) {Arrays.fill(dp[i], 0x3f3f3f3f);}for (int i = 1; i <= n; i++) {arr[i] = nextInt();arr[n + i] = arr[i];}for (int i = 1; i <= n * 2; i++) {sum[i] = sum[i - 1] + arr[i];dp[i][i] = 0;}for (int len = 2; len <= n; len++) {for (int start = 1; start + len - 1 <= n * 2; start++) {int end = start + len - 1;for (int k = start; k < end; k++) {dp[start][end] = Math.min(dp[start][end], dp[start][k] + dp[k + 1][end] + sum[end] - sum[start - 1]);dp_[start][end] = Math.max(dp_[start][end], dp_[start][k] + dp_[k + 1][end] + sum[end] - sum[start - 1]);}}}int ans_min = 0x3f3f3f3f;int ans_max = 0;for(int i = 1; i <= n; i++) {ans_max = Math.max(ans_max, dp_[i][i + n - 1]);ans_min = Math.min(ans_min, dp[i][i + n - 1]);}cout.println(ans_min);cout.println(ans_max);cout.flush();} catch (IOException e) {throw new RuntimeException(e);}}}

[P1063 NOIP 2006 提高组] 能量项链 - 洛谷 (luogu.com.cn)

  • 只是题目长了一点而已,本质上还是和环形dp没有多大区别
  • 难点就是在于每次合并的\(n*m*t\)怎么计算,我们可以发现规律就是当前区间起点的头标记*当前区间末尾点的尾标记*k(区间中的隔断点)的尾结点即可
package shuati;import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;public class Main implements Runnable {static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));//static Scanner cin = new Scanner(System.in);static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));static int n;static final int N = (int) (1e2 + 10);static zhuZi[] zhuZis = new zhuZi[N * 2];static int[][] dp = new int[N * 2][N * 2];public static void main(String[] args) {new Thread(null, new Main(), "", 1 << 29).start();}public static int nextInt() throws IOException {cin.nextToken();return (int) cin.nval;}//    public static String next() throws IOException {
//        return cin.next();
//    }@Overridepublic void run() {try {n = nextInt();for (int i = 1; i <= n * 2; i++) zhuZis[i] = new zhuZi();for (int i = 1; i <= n; i++) {int x = nextInt();zhuZis[i].pre = x;if (i > 1) zhuZis[i - 1].tail = x;if (i == n) zhuZis[i].tail = zhuZis[1].pre;}for (int i = 1; i <= n; i++) zhuZis[i + n] = zhuZis[i];for (int len = 2; len <= n; len++) {for(int start = 1; start + len - 1 <= n * 2; start++) {int end = start + len - 1;for (int k = start; k < end; k++) {int num = zhuZis[start].pre * zhuZis[end].tail * zhuZis[k].tail;dp[start][end] = Math.max(dp[start][end], dp[start][k] + dp[k + 1][end] + num);}}}int ans = 0;for (int i = 1; i <= n; i++) {ans = Math.max(ans, dp[i][n + i - 1]);}cout.println(ans);cout.flush();} catch (IOException e) {throw new RuntimeException(e);}}static class zhuZi {int pre;int tail;}
}

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

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

相关文章

昆明理工大学25考研计算机调剂名额

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理

【DeepSeek】打造智能微信机器人:wxauto 与 DeepSeek 的完美结合

免责声明: 本文仅用于交流学习,请大家务必保护好自己的账号安全,谨慎使用相关技术。# 自动化工具 在当今的数字化时代,自动化工具和人工智能技术的结合为我们的生活和工作带来了极大的便利。微信作为中国最流行的即时通讯工具之一,拥有庞大的用户群体。本文将介绍如何使用…

ZR 省选摆烂记

Day 1 - 数据结构 链表 Problem 1 - 洛谷 P10061 很精妙的链表题。 首先考虑特殊性质,旋转整个矩阵改怎么做。 显然只需要维护矩阵旋转了多少次即可。 特殊性质好做的原因正是矩阵的“结构”没有变,原来相邻的数还是相邻,即旋转后的修改可以映射到原来矩阵的修改。 因此考虑…

【Deepseek】教你将Deepseek接入WPS和Word/Excel日常办公使用

以下文章来源于像梦又似花 ,作者小编 以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用: 1、下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 OfficeAI 助手 是…

4.2 内存的逻辑模型是楼房

编程语言中的数据类型表示存储的是何种类型的数据 根据程序中所指定的变量的数据类型的不同,读写的物理内存大小也会随之发生变化 在不同的编程语言中,变量可以指定的数据类型的最大长度也不相同 C语言中,8字节(=64位)的double类型是最大的

题解:SP6517 JOCHEF - Farmer Sepp

怎么题解全是 dp?可以用笛卡尔树啊!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,…

4.1 内存的物理机制很简单

内存实际上是一种名为内存IC的电子元件。 内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址,来进行数据的书写。 虽然这是一个虚拟的内存IC,但他的引脚和实际的内存IC是一样的。1024=1K 8位=1字节 计算机使用的内存IC中…

洛谷P1191 矩形 题解

笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,它有一个重要性质:当这个笛卡尔树为小…

洛谷P2701 [USACO5.3] 巨大的牛棚Big Barn 题解

怎么题解全是清一色的 dp?可以用笛卡尔树啊(虽然麻烦了很多,但是我热爱)!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔…

告别 DeepSeek 系统繁忙,七个 DeepSeek 曲线救国平替入口,官网崩溃也能用!

前言 DeepSeek作为一款备受瞩目的国产大模型,以其强大的功能和卓越的性能赢得了众多用户的青睐。然而,随着用户量的激增,DeepSeek官网近期频繁遭遇服务器繁忙甚至崩溃的问题,给广大用户带来了不小的困扰。面对这一现状,许多用户急于寻找能够替代或绕过官网限制的方法,以继…

第一章笔记

1.2CPU是寄存器的集合体 程序是把寄存器作为对象来描述的。 通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。 汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言 指令都会有一个…

ARC191 192 题解

ARC191 题解 A - Replace Digits简要题意给定一个长为 \(n\) 的字符串 \(a\)。\(m\) 次操作,第 \(k\) 次给定一个字符 \(b_k\),你需要选择一个 \(i \in [1, n]\) 并将 \(a_i\) 替换成 \(b_k\)。 求最后能得到的所有字符串中,字典序最大的是什么。 \(1 \leq n, m \leq 10^6\)…