数字串分割为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 2022-10-18 21:18  towboat  阅读(17)  评论(0)    收藏  举报