P1018 乘积最大

10 篇文章 1 订阅
H y p e r l i n k Hyperlink Hyperlink

https://www.luogu.com.cn/problem/P1018


D e s c r i p t i o n Description Description

给定一个位数为 n n n的正整数,要求在其中添加 m m m个乘号,使得这 m + 1 m+1 m+1个部分的乘积最大

数据范围: n ≤ 40 , m ≤ 6 n\leq 40,m\leq 6 n40,m6


S o l u t i o n Solution Solution

暴力枚举每个乘号放哪里显然是会 T T T的,这样的复杂度是 O ( n m ) O(n^m) O(nm)

考虑区间 d p dp dp,设 f [ i ] [ k ] f[i][k] f[i][k]表示前 i i i个数,放了 k k k个乘号的最大乘积
显然 f [ i ] [ 0 ] = a [ i ] [ 0 ] f[i][0]=a[i][0] f[i][0]=a[i][0] a [ i ] [ j ] a[i][j] a[i][j]表示第 i i i位开始到第 j j j位构成的数,这可以 n 2 n^2 n2预处理,当然也可以边转移边算,这样复杂度多一个 n n n

对于每放入一个乘号,考虑它放入的位置,设其放在 j j j的后面,则有
f [ i ] [ k ] = m a x { f [ j ] [ k − 1 ] × a [ j + 1 ] [ i ] } f[i][k]=max\{f[j][k-1]\times a[j+1][i]\} f[i][k]=max{f[j][k1]×a[j+1][i]}
表示在 j j j后面放一个乘号,和 [ j + 1 , i ] [j+1,i] [j+1,i]这部分的数乘在一起,则构成了对 f [ i ] [ k ] f[i][k] f[i][k]的转移

终态: f [ n ] [ m ] f[n][m] f[n][m]

这样的做法复杂度为 O ( n 3 ) O(n^3) O(n3)【预处理 a a a的前提下,不预处理的话多一个 n n n】,结合 l o n g   l o n g long\ long long long能拿到 60 p t s 60pts 60pts的好成绩

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
char s[41];int n,m;
LL a[41][41],f[41][7];
int main()
{
	scanf("%d%d\n",&n,&m);
	scanf("%s",s+1);
	for(register int i=1;i<=n;i++)
	{
		a[i][i]=s[i]-48;
		for(register int j=i+1;j<=n;j++) a[i][j]=a[i][j-1]*10+s[j]-48;
	}
	for(register int i=1;i<=n;i++) f[i][0]=a[1][i];
	for(register int k=1;k<=m;k++)
     for(register int i=k+1;i<=n;i++)
	  for(register int j=k;j<i;j++)
	   f[i][k]=max(f[i][k],f[j][k-1]*a[j+1][i]);
	printf("%lld",f[n][m]);
}

没有满分的原因是因为没加高精度,我们用结构体可以使代码简洁些
压位高精只是个人喜好,因为这样跑得快,数组也可以开得更小,当然你也可以不压位

带上高精度之后的复杂度是 O ( n 3 L e n 2 ) O(n^3Len^2) O(n3Len2) L e n Len Len表示高精度数组的大小


C o d e Code Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
char s[41];int n,m;
struct int233
{
	int t[41];
	int233(){memset(t,0,sizeof(t));}//写这一行是为了懒得清空
}a[41][41],f[41][41];//定义大整数
inline int233 Mul_1(int233 A,int x)//高精乘单精
{
	int g=0;
	for(register int j=1;j<=40;j++)
	{
		g=A.t[j]*x+g;
		A.t[j]=g%10000;
		g/=10000;
	}
	return A;
}
inline int233 Add(int233 A,int x)//高精加高精
{
	int g=0;
	A.t[1]+=x;
	for(register int j=1;j<=40;j++)
	{
		g=A.t[j]+g;
		A.t[j]=g%10000;
		g/=10000;
	}
	return A;
}
inline int233 Mul_2(int233 A,int233 B)//高精乘高精
{
	int233 C;
	for(register int i=1;i<=20;i++)
	 for(register int j=1;j<=20;j++)
	{
	  	C.t[i+j-1]=C.t[i+j-1]+A.t[i]*B.t[j];
        C.t[i+j]=C.t[i+j]+C.t[i+j-1]/10000;
        C.t[i+j-1]=C.t[i+j-1]%10000;
	}
	return C;
}
inline void print(int233 x)//输出高精度数组
{
	int j=40;
	while(!x.t[j]&&j>1) j--;printf("%d",x.t[j]);
	for(register int i=j-1;i;i--) printf("%04d",x.t[i]);
	return;
}
inline bool Compare(int233 A,int233 B)//比较A,B的大小,A大返回True
{
	for(register int i=40;i;i--) if(A.t[i]!=B.t[i]) return A.t[i]>B.t[i];
	return false;
}
int main()
{
	scanf("%d%d\n",&n,&m);
	scanf("%s",s+1);
	for(register int i=1;i<=n;i++)
	{
		a[i][i].t[1]=s[i]-48;
		for(register int j=i+1;j<=n;j++) 
		{
			a[i][j]=Mul_1(a[i][j-1],10);//乘十
			a[i][j]=Add(a[i][j],s[j]-48);//加上去
		}
	}
	for(register int i=1;i<=n;i++) f[i][0]=a[1][i];
	for(register int k=1;k<=m;k++)
     for(register int i=k+1;i<=n;i++)
	  for(register int j=k;j<i;j++)
	{
		int233 tmp=Mul_2(f[j][k-1],a[j+1][i]);//高精乘高精
		if(Compare(tmp,f[i][k])) f[i][k]=tmp;//转移
	}
	print(f[n][m]);//输出
}
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值