社区讨论

求调

P1018[NOIP 2000 提高组] 乘积最大参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m585upyg
此快照首次捕获于
2024/12/28 20:31
去年
此快照最后确认于
2025/11/04 12:14
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[45];
struct bign
{
	int d[105],len=0;
	bign(){memset(d,0,sizeof(d));}
}dp[45][10];
bign val(int l,int r)
{
	bign c;
	c.len=r-l+1;
	for(int i=r;i>=l;i--)
		c.d[i-l+1]=s[i]-'0';
	return c;
}
bign mx(bign a, bign b)
{
	if(a.len>b.len)return a;
	if(b.len>a.len)return b;
	for(int i=a.len;i>=1;i--)
	{
		if(a.d[i]>b.d[i]) return a;
		if(b.d[i]>a.d[i]) return b;
	}
	return a;
}
bign mul(bign a, bign b)
{
	bign c;
	c.len=a.len+b.len-1;
	for(int i=1;i<=a.len;i++)
	{
		for(int j=1;j<=b.len;j++)
		{
			c.d[i+j-1]+=a.d[i]*b.d[i];
		}
	}
	for(int i=1;i<=c.len;i++)
	{
		c.d[i+1]+=c.d[i]/10;
		c.d[i]%=10;
	}
	if(c.d[c.len+1])
		c.len++;
	while(c.d[c.len]==0 && c.len>1)
		c.len--;
	return c;	
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>s+1;
	for(int i=1;i<=n;i++)
	{
		dp[i][0]=val(1,i);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=min(i-1,m);j++)
		{
			for(int k=j;k<i;k++)
			{
				dp[i][j]=mx(dp[i][j],mul(dp[k][j-1],val(k+1,i)));
			}
		}
	}
	for(int i=dp[n][m].len;i>=1;i--)
		cout<<dp[n][m].d[i];
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...