随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

数字串分割为m个部分,求乘积最大?

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

3 * 12

31*2

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

 

转移方程 在注释里,不解释

以下代码只有80分,AC需要换成高精度(笔者大概是没学过的

#include <iostream>
#include <cstring>
using namespace std ; 
const int N=50; 
#define ll __int128

template <typename _Tp> void read(_Tp &x) {
	char ch;bool flag=0;x=0;
	while(ch=getchar(),!isdigit(ch)) if(ch=='-')flag=1;
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	if(flag) x=-x;
}
 void print(ll x) {
	if(x<0) {x=-x;putchar('-');}
	if(x>9) print(x/10);
	putchar(x%10+'0');
 } 

 int a[N];
 ll n,m,num[N][N],f[N][9];
 
 // f[i][j] =max{ f[k][j-1]*num(k,i) }
 signed main(){
 	ll i,j,k,t; 
 	read(n); read(m);
 	char ch;
 	for(i=1;i<=n;i++) cin>>ch,a[i]=ch-'0';
 	for(i=1;i<=n;i++)
 	 for(j=1;j<=i;j++){
 	 	t=0;
 	 	for(k=j;k<=i;k++) t=t*10+a[k];
 	 	num[j][i]=t;
	  }
 	for(i=1;i<=n;i++) f[i][0]=num[1][i];
 	
 	for(i=1;i<=n;i++)
 	 for(j=1;j<=m&&j<i;j++)
 	   for(k=1;k<=i;k++)
 	 	f[i][j] =max(f[i][j],f[k-1][j-1]*num[k][i]);
	  
	print(f[n][m]);
 } 
 
 
 

posted on   towboat  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示