【洛谷P1005】矩阵取数游戏【区间dp】【高精度】

洛谷P1005 高精++高精高精××单精max{max{高精,,高精}} 阅读详情

题目:

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素ai,ja_{i,j}ai,j​
均为非负整数。游戏规则如下:

  1. 每次取数时须从每行各取走一个元素,共nnn个。经过mmm次后取完矩阵内所有元素;
  2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
  3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值×2i\times 2^i×2i ,其中iii表示第iii次取数(从1开始编号);
  4. 游戏结束总得分为mmm次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。


思路:

因为每一行的游戏是互不影响的,所以我们可以一行一行来做。
对于每一行,设f[i][j]f[i][j]f[i][j]表示取完i∼ji\sim ji∼j的最大得分,那么显然有
f[i][j]=max(f[i−1][j]+a[i]×2n−(j−i),f[i][j−1]+a[j]×2n−(j−i))f[i][j]=max(f[i-1][j]+a[i]\times 2^{n-(j-i)},f[i][j-1]+a[j]\times 2^{n-(j-i)})f[i][j]=max(f[i−1][j]+a[i]×2n−(j−i),f[i][j−1]+a[j]×2n−(j−i))
高精度转移即可。


代码:

#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=90,MAXN=10;
int n,m,ans[MAXN+1],f[N][N][MAXN+1],power[N][MAXN+1],a[N][MAXN+1],p[MAXN+1],q[MAXN+1];

void mul(int c[MAXN+1],int a[MAXN+1],int b[MAXN+1])
{
	for (register int i=MAXN;i>=1;i--)
	{
		int t=0;
		for (register int j=MAXN;j>=1;j--) 
		{
			c[i+j-MAXN]+=a[i]*b[j]+t;
			t=c[i+j-MAXN]/10000;
			c[i+j-MAXN]%=10000;
		}
	}
}

void add(int a[MAXN+1],int b[MAXN+1])
{
	int t=0;
	for (register int i=MAXN;i>=1;i--)
	{
		a[i]+=b[i]+t;
		t=a[i]/10000;
		a[i]%=10000;
	}
}

bool check(int a[MAXN+1],int b[MAXN+1])
{
	for (register int i=1;i<=MAXN;i++)
		if (a[i]>b[i]) return 1;
			else if (a[i]<b[i]) return 0;
	return 1;
}

int main()
{
//	freopen("testdata.in","r",stdin);
	scanf("%d%d",&m,&n);
	power[0][MAXN]=1; power[1][MAXN]=2;
	for (register int i=2;i<=n;i++)
		mul(power[i],power[i-1],power[1]);
	while (m--)
	{
		memset(a,0,sizeof(a));
		memset(f,0,sizeof(f));
		for (register int i=1,x;i<=n;i++)
		{
			scanf("%d",&x);
			for (register int j=MAXN;j>=1;j--,x/=10000)
				a[i][j]=x%10000;
			mul(f[i][i],a[i],power[n]);
		}
		for (register int i=n;i>=1;i--)
			for (register int j=i+1;j<=n;j++)
			{
				memset(p,0,sizeof(p));
				memset(q,0,sizeof(q));
				mul(p,a[i],power[n-(j-i)]);
				mul(q,a[j],power[n-(j-i)]);
				add(p,f[i+1][j]);
				add(q,f[i][j-1]);
				if (check(p,q)) memcpy(f[i][j],p,sizeof(p));
					else memcpy(f[i][j],q,sizeof(q));
			}
		add(ans,f[1][n]);
	}
	int i=1;
	while (!ans[i] && i<=MAXN) i++;
	if (i>MAXN) return !printf("0");
	printf("%d",ans[i]);
	for (i++;i<=MAXN;i++)
	{
		if (ans[i]<1000) putchar(48);
		if (ans[i]<100) putchar(48);
		if (ans[i]<10) putchar(48);
		printf("%d",ans[i]);
	}
	return 0;
}
洛谷 P1005 矩阵取数游戏 高精度+线性dp 阅读详情

相关推荐

题解:洛谷 P1005 [NOIP 2007 提高组] 矩阵取数游戏

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的。行,为一个整数,即输入矩阵取数后的最大得分。第一行为两个用空格隔开的整数。个用单个空格隔开的非负整数。的矩阵,矩阵中的每个元素。#普及+# #区间DP#本文分享的必刷题目是从。

团爸讲算法 985

洛谷.1005 经典动态规划

可以将问题简化为求出含有障碍物情况下到达目的地的路线条数,然后二维dp速推,容易忘记马本身的位置是不能过去的,还有就是挖掉离马距离为5的点可以不必分类,勾股定理即可,因为5只能拆成1 2两个整数的平方和

qq_51129938的博客 771

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 389

【洛谷】P1005 矩阵取数游戏(动态规划)

题目链接 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×m的矩阵,矩阵中的每个元素 ai,j​均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共n个。经过m次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值 * 2^i,其中i表示第...

悲伤无声地涌出来 1426

ESP32、MicroPython、天问ASR-PRO,串口发送数据并播报

天问ASRPRO语音芯片内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。ASR-PRO可以图形化编程,降低开发难度,对小白友好。之前使用ASRPRO与ESP32进行过语音控制,这次由于一个项目需要对ESP处理过后的数据进行播报,就想到利用该模块。以下程序主要为测试代码,并非实际项目,仅供参考学习(若有错误,欢迎指正)。二者通过串口通信,波特率为9600。

weak_student的博客 5951

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 740

Luogu P1005 [NOIP2007 提高组] 矩阵取数游戏

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 $n \times m$ 的矩阵($1\le n,m\le 80$),矩阵中的每个元素 $a_{i,j}$ 均为非负整数($0\le a_{i,j}\le1000$)。$,$1\le n,m\le 80$,$0\le a_{i,j}\le1000$,最多要计算到$2^{80}$,所以现有的unsigned long long是无法解决这个问题的,摆在我们眼前的是两条路:高精度和__int128。

yanzicheng1的博客 924

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1073

洛谷 P1005 矩阵取数游戏(区间覆盖DP)

任重而道远 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}ai,j​ 均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共 nn 个。经过 mm 次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取...

TRS_07170的博客 1260

告别手动复制粘贴!用Python脚本+pywinauto实现PC微信消息自动发送(附完整源码)

本文详细介绍了如何利用Python和pywinauto实现PC微信消息的自动化发送,告别繁琐的手动操作。从环境搭建、UI控件定位到构建健壮的发送流程,再到高级功能扩展和项目打包部署,全面解析了自动化办公的实现方案,显著提升工作效率。

weixin_30315723的博客 585

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链

本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。

jenkins8butler的博客 496

洛谷P1005(矩阵取数游戏)

洛谷P1005   这题好像很难啊,我花了一个上午才做出来,首先一个重要的思想是把数组分割成小数组去遍历,递推公式是f[i,j]=max(a(i)+f[i+1,j],a(j)+f[i,j-1]),刚开始我想用递归和longlong去做,结果就报错TLE,复杂度太高了,没办法只能优化到非递归结构,选择用数组存储的形式,注意,这里我看到很多人选择用一个矩阵a去表示,a(i,j)=f(i,j),但是这样的话,f(j,i)是不存在的,就会把这个矩阵一半的空间浪费掉,这显然不符合我勤俭节约的作风,从matlab中将关

ly3098268698的博客 1351

Flink实战(101):双流join(三)双流中实现Inner Join、Left Join与Right Join

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 简介 之前文章中提到JoinedStream与CoGroupedStream,例如下列代码: dataStream.join(otherStream) .where(0).equalTo(1) .window(TumblingEventTimeWindows.of(Time.seconds(3))) .apply { ... } 由于joinedStream与

微信搜:import_bigdata,大数据领域硬核原创作者 737

【洛谷】【区间dp】【高精度】P1005 [NOIP2007 提高组] 矩阵取数游戏

题目链接:https://www.luogu.com.cn/problem/P1005 题目描述   帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n×m 的矩阵,矩阵中的每个元素 ai,j 均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共 n个。经过 m次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值 x2i,其中 i表示第 i次取数(从 1开始编号); 游戏结束总得分为

要像蜗牛一样一步一步往上爬! 487

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)

《C++面向对象程序设计》✍千处细节、万字总结 文章目录《C++面向对象程序设计》✍千处细节、万字总结一、面向对象程序设计二、C++基础2.1 C++的产生和特点2.2 一个简单的C++示例程序2.3 C++在非面向对象方面对C语言的扩充输入和输出cinconst修饰符void型指针内联函数带有默认参数值的函数函数重载作用域标识符"::"强制类型转换new和delete运算符引用三、类和对象(一)3.1 类的构成3.2 成员函数的定义3.3 对象的定义和使用3.4 构造函数与析构函数构造函数成员初始化列表

像写诗一样优雅地写代码~ 78万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

洛谷 P1005 矩阵取数游戏 (区间dp+高精度)

这道题大部分时间都在弄高精度…… 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的,i到j的数并没有取。 那么这个状态要不是取了第i-1个数转移而来,要不是取了第j+1个数转移而来。 所以可以写出方程 f[i][j] = max(f[i-1][j] + a[i-1] * mi[m-...

自强不息 厚德载物 351

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

洛谷P1005(矩阵取数游戏[NOIP 2007 提高组] )题解

洛谷P1005详解10000字

2201_75316840的博客 1194

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

洛谷P1005 矩阵取数游戏

洛谷P1005 矩阵取数游戏 题意: 给一个n行m列的矩阵,m次取数,每次从n行中每一行取一个数(只能从每一行的首/尾取),每取一个数对应一个得分,每行取数的得分 = 被取走的元素值$ \times 2^i$,其中i表示第i次取数(从1开始编号)。求最大得分之和。 分析一下: 虽然题目给的是一个矩阵,但是各行互不影响,因此只需每行各自用dp求出本行最优解,然和相加就是总体最优解。 用M表示输入的矩...

yudi的博客 333

[洛谷]P1005 矩阵取数游戏 (#区间dp)

题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共nn个。经过mm次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值\times 2^i...

A.pro的博客 605

洛谷 P1005 矩阵取数游戏 区间dp

题目:https://www.luogu.org/problemnew/show/P1005 类似的区间dp:https://blog.youkuaiyun.com/qq_32259423/article/details/89482764 版权声明:转载请注明出处 [ametake版权所有]http://blog.youkuaiyun.com/ametake欢迎来看 https://blog.csdn.n...

swqeaaa的博客 238

洛谷 P1005 [NOIP 2007 提高组] 矩阵取数游戏

先取前面的(a[i]),再取剩下的f[i+1][j]即[i+1,j]的最大值:2f[i+1][j]+2a[i]即把接下来取的所有数乘上2,也就是把接下来取的所有数从x2i变为x2i+1即每次取都把之前的翻一倍,然后当前取的值a[i]要乘上21即2。先取后面的(a[j]),再取剩下的f[i][j−1]即[i,j−1]的最大值:2f[i][j−1]+2a[j]同理。故转移方程为f[i][j]=max(2f[i+1][j]+2a[i],2f[i][j−1]+2a[j])有一个n×m的矩阵,对于第i行,每次。

2402_86277110的博客 863

P1005 矩阵取数游戏 DP+__int128

P1005 矩阵取数游戏 链接在此https://www.luogu.org/problem/P1005 先考虑部分分60分 可以看到dp是可以稳稳地得到60分的。 而dp思路就是将每一行单独求dp dp方程式为 dp[i][j]=max(dp[i-1][j]+a[i]*fpow(2,n-(j-i)+1),dp[i][j]); dp[i][j]=max(dp[i][j+1]+a[j]*...

keydou 289
上一篇: 【JZOJ1247】【洛谷P2870】队列变换【hash】【二分】【贪心】
下一篇: 【JZOJ1402】偷懒的小X【dfs】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值