poj 2102 桥dp 好题

基于Ollama本地大模型的Python自动化翻译工具开发实践 本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。 阅读详情

小记: dp算法一般有明确的状态转移方程,然而当这种方程太过复杂,一个dp[i][j]依赖于很多个dp[i-1][k]的时候,就会影响dp算法的复杂度,也就是说计算每一个dp[i][j]需要的不只O(1)的时间,而是O(n)或者更高的时间。这时候就需要一个桥梁用于沟通上一次的dp数组和这一次的dp数组,让dp[i][j]不依赖于dp[i-1][k]而是依赖于这个通过预处理得到的桥梁,来实现在O(1)的时间内算出当前dp值。(大多数时候前缀和就是一个很合适的桥梁)

题意:
给你n行3列的矩阵,告诉你每列和是多少(c0,c1,c2),每行和是多少(num0,num1,num2…),问你能构造出多少种这样的矩阵,(以上所有数字小于等于125,答案对1017取模)

输入
3 //有三行
1 2 3 //c0,c1,c2
2 3 4 //n0,n1,n2…

输出
0

思路:
这个是dp的题,定义dp[x][a][b][c]是在x行第一列剩下a可以用,第二列剩下b可以用,第三列剩下c的时候有多少种可能的情况。那么最后的答案就是dp[n-1][c0][c1][c2]

那么dp[x][a][b][c] j就等于所有的dp[x-1][i][j][k]相加,当a>=i&&b>=j&&c>=k&&
(a+b+c-i-j-k) == num[x]的时候,

所以代码应该这样写

ll dp[128][128][128][128];

	for (int i = 0; i < n; i++) 
		for (int j = 0; j <= c0 ; j++) 
			for (int k = 0; k <= c1; k++) 
				for (int l = 0; l <= c2 ; k++) {
					dp[i][j][k][l] = 0;

					for (int o = j - num[i]; o <= j; o++) 
						for (int p = k - num[i]; p <= k; p++) 
							for (int q = l - num[i]; q <= l; q++) {
								if (j + k + l - o - p - q != num[i])
									continue;
								dp[i][j][k][l] += dp[i - 1][o][p][q];
							}
				}

不过很显然,当j和k确定的时候,l就确定了,所以可以给dp降一个维度,
代码变成这样

ll dp[128][128][128];

	for (int i = 0; i < n; i++) 
		for (int j = 0; j <= c0 && j <= num[i]; j++) 
			for (int k = 0; k <= c1 && j + k <= num[i]; k++) {
				dp[i][j][k] = 0;
				for (int o = j - num[i]; o <= j; o++)
					for (int p = k - num[i]; p <= k && j + k - o - p <= num[i]; p++) {//最终差值要等于num[i],由于有l,所以只需要小于等于
						dp[i][j][k] += dp[i - 1][o][p];
					}
			}

而且很明显dp数组永远只用了两个128*128的大小,所以做个轮动数组,变成这样

int so() {
	ll dp[2][128][128];
	ll(*last)[128] = dp[1], (*now)[128] = dp[0];
	for (int i = 0; i < n; i++, swap(last, now))
		for (int j = 0; j <= c0 && j <= num[i]; j++) 
			for (int k = 0; k <= c1 && j + k <= num[i]; k++) {
				now[j][k] = 0;
				for (int o = j - num[i]; o <= j; o++)
					for (int p = k - num[i]; p <= k && j + k - o - p <= num[i]; p++) {//最终差值要等于num[i],由于有l,所以只需要小于等于
						now[j][k] += last[o][p];
					}
			}
}

这样时间复杂度是O(n5)明显无法通过。

但是再观察,now[i][j]的值依赖于last的值,如果你把last数组看成一个矩阵,那么对于里面的两层循环,now[j][k]实际上是last矩阵上的一个三角形区域的值的和(至于为什么是三角形区域,希望读者自己在草稿本上画一下就明白了)

在这里插入图片描述

那么我们就可以通过一些预处理的方式,提前算出关于这个三角形一些需要的数据,就可以在O(1)的时间算出now[j][k]。

如果我们提前输出last数组的前缀和,那么我们就可以在O(n)的时间内算出now[j][k],像这样
在这里插入图片描述
图中每一个横条表示一个前缀和。这样整体的复杂度就将到了O(n4),总的循环次数就是2*108,很明显就是不一定能通过的,我们需要进一步降低复杂度。

观察一下,如果要求的和是一个四边形,那么now[j][k]和now[j-1][k]是有明确的关系的
在这里插入图片描述
那么now[j][k]等于now[j-1][k]加上红色部分,减去蓝色部分,那么三角形也有类似的关系
在这里插入图片描述

为什么是now[j-1][k+1]呢,因为只有这两个三角形才有公共的斜边,这样才能避免去计算斜边上的前缀和。这样now[j][k]等于now[j-1][k+1]加上红色部分,减去蓝色部分
这里有两个特色情况,j=0或者k=num[i]时,now[j-1][k+1]不存在,所以只能用O(n)个前缀和来算,但这种情况只有O(n)个,其他的情况可以在O(1)的时间内算出来,所以这时候总的时间复杂度是O(n3),循环次数约是2*106,这时候就能通过。

代码写出来是这个样子
//++i比i++更快,应该用++i的

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>

#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int

using namespace std;

int n, c0,c1,c2, num[128];
ll dp[2][128][128], bdp[2][128][128];//bridge_dp
ll mod = (ll)(1e17);

ll get_sum(int cr, int itr, int beg, int end) {
	if (cr == 0) {
		beg = max(beg, 0);
		return beg ? (bdp[0][itr][end] - bdp[0][itr][beg - 1] + mod) % mod : bdp[0][itr][end];
	}
	beg = max(beg, 0);
	return beg ? (bdp[1][end][itr] - bdp[1][beg - 1][itr] + mod) % mod : bdp[1][end][itr];
}

ll solve() {
	ll (*last)[128] = dp[0], (*now)[128] = dp[1];
	for (int j = 0; j <= c0; j++) 
		for (int k = 0; k <= c1; k++) 
			last[j][k] = (j + k <= num[0]);
	
	for (int i = 1; i < n; i++, swap(last, now)) {
		for (int j = 0; j <= c0; j++) {
			bdp[0][j][0] = last[j][0];
			for (int k = 1; k <= c1; k++) 
				bdp[0][j][k] = (last[j][k] + bdp[0][j][k - 1]) % mod;
		}
		for (int k = 0; k <= c1; k++) {
			bdp[1][0][k] = last[0][k];
			for (int j = 1; j <= c0; j++) 
				bdp[1][j][k] = (last[j][k] + bdp[1][j - 1][k]) % mod;
		}

		for (int j = 0; j <= c0; j++) 
			for (int k = 0; k <= c1; k++) 
				if (j - 1 >= 0 && k + 1 <= c1) {
					//如果可以划分三角形用三角形去算
					now[j][k] = now[j - 1][k + 1] + get_sum(0, j, k - num[i], k) - get_sum(1, k + 1, j - num[i] - 1, j - 1) + mod;
					now[j][k] %= mod;
				}
				else {
					//如果不能划分三角形,就用前缀和去算
					now[j][k] = 0;
					for (int t = 0; t <= j && t <= num[i]; t++) {
						now[j][k] += get_sum(0, j - t, k - num[i] + t, k);
						now[j][k] %= mod;
					}
				}
	}
	return last[c0][c1];
}

int main() {
	while (scanf("%d%d%d%d", &n,&c0,&c1,&c2) != EOF) {
		for (int i = 0; i < n; ++i)
			scanf("%d", num + i);
		int s = 0;
		for (int i = 0; i < n; i++)
			s += num[i];
		if (c0 + c1 + c2 != s) {
			printf("0\n");
			continue;
		}
		
		printf("%lld\n", solve());
	}
	return 0;
}
ChatGPT启蒙之旅:弟弟妹妹的关键概念入门 本文主要介绍了ChatGPT启蒙之旅:弟弟妹妹的关键概念探险,希望能对初学大模型的同学们有所帮助。 文章目录 1. 背景 2. GPT是个什么样的人? 3. GPT使用的核心思维 4. GPT使用的场景介绍 阅读详情

相关推荐

菲涅尔波带片

菲涅尔波带片的简介,以及matlab绘制

Bestchinese的博客 1万+

HDOJ2102(A计划) bfs

A计划Time Limit: 3000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1412Accepted Submission(s): 291 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再...

weixin_30685029的博客 504

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 211

HDU2102 A计划【BFS】

  A计划   Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25923    Accepted Submission(s): 6513     Problem Description 可怜的公主在一次次被魔王掳走一次次被...

海岛Blog 1831

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 326

CH341的I2C流模式(StreamI2C)到底怎么用?从EEPROM读写到自定义设备,一篇讲清参数配置逻辑

本文详细解析了CH341的I2C流模式(StreamI2C)的使用方法,从EEPROM读写到自定义设备的参数配置逻辑。通过深入分析I2C协议基础、StreamI2C参数映射关系及典型设备配置示例,帮助开发者快速掌握StreamI2C的应用技巧,解决实际开发中的常见问题。

weixin_30932215的博客 447

POJ 2102 Incredible! Impossible! 笔记

n*3的非负矩阵,给出每列的和,与每行的和。求满足条件的矩阵数。

woniupengpeng的专栏 485

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 246

HDOJ2102 深搜DFS解法+剪枝优化 入门题

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 6016 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们

勇敢前进的ACMer 745

从0到1打造一台机器人走起来

1)本体机械结构设计,依据人体生物学和生物力学知识,结合机器人运动时各关节扭矩需求,进行合理选用电机,比如胯部需要大扭矩,腿部惯量小等2)硬件拓扑上,分层架构的信号层和功率协同工作,高带宽,低延时,硬实时3)步态规划设计与验证环节实机回溯和部署过程:Real2Sim,Sim2Sim,Sim2Real。

weixin_43163941的博客 243

2026年3月GESP真题及题解(C++七级):物流网络

2026年3月GESP真题及题解(C++七级):物流网络

王老师青少年编程 1122

POJ前面的题目算法思路【转】

1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5-7 1003 Hangover 送分题 62% 2005-5-

梁山伯的专栏 5772

硬件工程师入门基础知识(一)基础元器件认识(二)

我们的电路输入一般是只有两种状态,0V 或者是其它的高电平(1.8V,3.3V,5V 等),截止状态一般不用怎么考虑,因为如果让三极管的 Vbe=0,自然就截止了,重要的是饱和状态如何保证。也就是说只要 Rb

小幽余生不加糖 1万+

动态规划入门(九) 区间DP

顾名思义,区间dp就是在区间上进行动态规划,求解一段区间上的最优解;该问题的求解思路主要是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。

这里是阿安的博客 6万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[kuangbin]各种各样的题单

[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 FZU 2150 UVA 11624 POJ 3984 HDU 1241 HDU 1495 HDU 2612 专题2 搜索进阶 HDU 1043 HDU 3567 HDU 2181 HDU 3533 HDU 1560 ZOJ 2477 HDU 3085 HDU 1067 HDU 2102 HDU 3001 专题3

qq_35975367的博客 1056

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【ACM刷题专题】这个假期一起来刷题把,刷完冲击区域赛,刷完拿不到奖随便打!

文章目录1、引言2、专题分享2.1 专题一 简单搜索2.2 专题二 搜索进阶2.3 专题三 Dancing Links舞蹈链2.4 专题四 最短路练习2.5 专题五 并查集2.6 专题六 最小生成树2.7专题七 线段树2.8 专题八 生成树2.9 专题九 连通图2.10 专题十 匹配问题2.11 专题十一 网络流2.12 专题十二 基础DP12.13 专题十三 基础计算几何2.14 专题十四 数论...

超逸の学习技术博客 8843

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

acm题单 转侵删

专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 FZU 2150 UVA 11624 POJ 3984 HDU 1241 HDU 1495 HDU 2612 专题2 搜索进阶 HDU 1043 HDU 3567 HDU 2181 HDU 3533 HDU 1560 ZOJ 2477 HDU 3085 HDU 1067 HDU 2102 HDU 3001 专题3 Dancing Links HUS

yoOvQ的博客 383

题

简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 FZU 2150 UVA 11624 POJ 3984 HDU 1241 HDU 1495 HDU 2612 搜索进阶 HDU 1043 HDU 3567 HDU 2181 HDU 3533 HDU 1560 ZOJ 2477 HDU 3085 ...

chengqidexue的博客 350

ZOJ1524 POJ1297 Supermarket

DP,类似于LCS,用滚动数组实现 /******************************************************************************* # Author : Neo Fung # Email : neosfung@gmail.com # Last modified: 2012-03-29 21:02 # Filen

Neo Fung的专栏 1121

福州0209 DAY5 动态规划模型

真正的巨坑,一寒假都写不完,慢慢来。 另,上课的学长(叫老师真的显得好老))好温和啊,这几天来第一次听这么透彻,甚至突然想好好学习一晚上。……………… 基本要素 阶段:把所给求解问题的过程恰当地分成若干相互联系的阶段。 一般是按某种线性关系划分的,比如时间先后etc。 状态:表示每个阶段的自然状况/客观条件,是不可控制因素。 ……教材上的说法太学究了,就是表示决策目前的一个状态...

二三两 281

kuangbin带你飞专题合集

[kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶...

繁凡さん的博客 2640

CCF认证训练行动路线图

通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题。 CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点。然而CCF试题数量上比较少,只看这些题难以做到全面的准备。 相关链接:CCF认证历年试题解。 PKU百练的一些题被作为NOI练习题,难度适中,作为基础训练是值得阅读的...

weixin_33700350的博客 486

算法学习经典例题整理

陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https://vjudge.net/contest/292904 分组背包:https://vjudge.net/contest/292902 多重背包:https://vjudge.net/contest/...

日拱一卒,功不唐捐 2860

[kuangbin带你飞]专题1-23题目集

专题一简单搜索  POJ 1321 棋盘问题 POJ 2251 Dungeon Master  POJ 3278 Catch That Cow  POJ 3279 Fliptile  POJ 1426 Find The Multiple  POJ 3126 Prime Path ...

luoru的博客 893

ccf认证学习路径

通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题。 CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点。然而CCF试题数量上比较少,只看这些题难以做到全面的准备。 相关链接:CCF认证历年试题解。 PKU百练的一些题被作为NOI练习题,难度适中,作为基础训练是值得阅读的。其他的一些题也具有参考价值,一并列在...

yzzbestcoder 1041

重走长征路---OI每周刷题记录---9月20日 2014

总目录详见https://blog.youkuaiyun.com/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做。2018-11-28 重走长征路---OI每周刷题记录---9月20日  2014 本周共计 题+题 测评地址: dp+素数筛法:「bzoj1025」[SCOI2009]游戏 凸包:「bzoj1670」[Usaco2006 Oct]B...

mrcrack的博客 366
上一篇: poj 2010 (二分加搜索)关于深搜的一种优美的写法
下一篇: poj 2111 有序dp走迷宫
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值