首页 > 其他分享 >1275:【例9.19】乘积最大

1275:【例9.19】乘积最大

时间:2022-10-10 09:24:57浏览次数:54  
标签:... 乘积 9.19 int LL 1275 dp include 个字符

题目链接

题意简述

设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串:312, 当N=3,K=1时会有以下两种分法:

  • 3*12=36

  • 31*2=62

这时,符合题目要求的结果是:31*2=62。

现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

样例

点击查看样例

分析

本题探讨的是一个序列在区间上的性质,因此用区间DP
最外层枚举用的乘号的个数
用\(dp[i][k]\)表示前\(i\)个数字中使用\(k\)个乘号
然后求前\(k+1,k+2,...,n\)的序列用\(k\)个乘号所能得到的最大值
其中对于前 \(i\) 个字符的序列,用 \(m\) 个乘号相乘时
其最大值的求法是先得到前\(i-1\)个字符用\(m-1\)个乘号的最大值然后枚举第 \(m\) 个乘号的位置(乘号的位置\(\in [m\sim i]\).前 \(i-1\) 个字符用 \(m-1\) 个字符相乘 ,那么 \(i-1 \geq m\))
\(dp[i][k]=max(dp[i][k],dp[j][k-1]*num[j+1][i])\)

预处理:
\(a[i...j]\)表示了\(str[i...j]\)组成的数字
\(dp[i][0]\)即前i个字符用\(0\)个乘号得到的结果,自然是\(a[1][i]\)

代码

点击查看代码
#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=20;
LL a[N][N];
LL dp[N][N];
char s[N];
int main()
{
	//freopen("uva.txt","r",stdin);
	int n,k;
	scanf("%d%d",&n,&k);
	scanf("%s",s+1);
	for(int i = 1;i <= n;i++)
	{
		a[i][i] = s[i]-'0';
	}
	for(int i = 1;i <= n;i++)
	{
		LL t = a[i][i];
		for(int j = i+1;j<=n;j++)
		{
			a[i][j] = t*10 + a[j][j];
			t = a[i][j];
		//	printf("%d %d %lld\n",i,j,a[i][j]);
		}
	}
	for(int i = 1;i <= n;i++)dp[i][0] = a[1][i];
	
	for(int m = 1;m <= k ;m ++)
	{
		for(int i = m + 1;i <= n ;i++)
		{
			for(int j = m ;j < i ;j++)
			{
				dp[i][m] = max(dp[i][m],dp[j][m-1]*a[j+1][i]); 
			}
		}
	}
	printf("%lld\n",dp[n][k]);
	return 0;
}

标签:...,乘积,9.19,int,LL,1275,dp,include,个字符
From: https://www.cnblogs.com/oijueshi/p/16773222.html

相关文章

  • 求十个数的乘积
    文字描述:①输入两个数i、n②用i表示相乘的次数,初始值为1,此时n也为1③若i<=10,转为第④步,否则转为第⑦步④将n和i相乘,为n⑤此时i+1,为i⑥返回第③步⑦输出n,此时n为十......
  • *洛谷 P1018 [NOIP2000 提高组] 乘积最大(dfs+高精度)
    说在前头此篇题解是记录自己的暴力写法,并不能100分满分通过洛谷测试数据(只有60)纯纯记录写法而写https://www.luogu.com.cn/problem/P1018我还说这么简单呢这题,想太......
  • P3983 塞斯石(9.19)
    题面:戳这里题意:①塞斯石是一种重要的东西,以塞斯(Si)为单位。②本来是单独存在,经过特殊处理后可以合并,合并后也可以切开③现在有一定量(Need)的塞斯石需要上市,卖家需要租船......
  • 605. 简单乘积
    文章目录​​Question​​​​Ideas​​​​Code​​Question读取两个整数值。在此之后,计算它们的乘积并将结果存储在名为PROD的变量中。输出结果如下例所示。输入格式共......
  • 上周热点回顾(9.19-9.25)
    热点随笔:· 前端必读2.0:如何在React中使用SpreadJS导入和导出Excel文件 (葡萄城技术团队)· 前端必读:如何在JavaScript中使用SpreadJS导入和导出Excel文件 (葡......
  • 「浙江理工大学ACM入队200题系列」问题 E: 零基础学C/C++78——求奇数的乘积
    本题是浙江理工大学ACM入队200题第七套中的E题(大概)我们先来看一下这题的题面.题面输入输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据......
  • 22.9.19-25
    关于54中指派飞机去组成通信链路的问题1.最小生成树通过查阅资料,得知(若简化问题为连线),则可以套用最小生成树问题的两种解法参考如下博客运行prim解法,效果如同https://b......
  • 2022.9.19———HZOI【CSP-S模拟6】游寄
    \(Preface\)试验一下难度。———Au爷沈队(学长)这句话,我理解为“铈囐镒䪗䁪鑟”。\(Rank24/43\)\(80pts+9pts+0pts+0pts=89pts\)\(\mathfrak{T1}\玩水\)......
  • 【9.19 更新】羊了个羊-使用 HTTP Debugger 修改回复规则通关
    HTTPDebugger能抓到PC小程序的请求,所以可以使用HTTPDebugger自动回复规则来修改。步骤:打开HTTPDebugger后,PC微信启动羊了个羊小程序,点加入羊圈后看到以下两个请求。筛选......
  • 9.19
    Java中的一场处理方式(机制)有哪些?try-catch在异常可能出现处获取异常并处理异常。throw,throws抛出异常,会逐层抛出到方法的调用者处Error和Exception的区别是什么?Er......