社区讨论

55pts求调,悬5关

P1388算式参与者 4已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mdmq7n9u
此快照首次捕获于
2025/07/28 14:27
7 个月前
此快照最后确认于
2025/11/04 03:36
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000],f[20][20][20];
signed main()
{
	memset(f,-1,sizeof(f));
	long long n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>f[i][i][0];
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<n;j++)
			f[i][j][0]=f[i][j-1][0]+f[j][j][0];
	for(int len=2;len<=n;len++) //长度 
	{
		for(int l=1;l+len-1<=n;l++) //左端点 
		{
			int r=l+len-1; //右端点 
			for(int k=1;k<=min(m,len-1);k++) //乘号个数 
			{
				for(int q=0;q<=k;q++) //乘号个数断点 左边取q个,右边取k-q个 
					for(int w=l;w<r;w++) //转移断点 
						if(f[l][w][q]!=-1 && f[w+1][r][k-q]!=-1)
						{
							f[l][r][k]=max(f[l][r][k],f[l][w][q]+f[w+1][r][k-q]);
						}
				for(int q=0;q<k;q++)
					for(int w=l;w<r;w++)
					{
						if((f[w+1][r][k-q-1]!=-1 && f[l][w][q]!=-1))
							f[l][r][k]=max(f[l][r][k],f[l][w][q]*f[w+1][r][k-q-1]);
						if((f[l][w][q-1]!=-1 && f[w+1][r][k-q]!=-1))
							f[l][r][k]=max(f[l][r][k],f[l][w][q-1]*f[w+1][r][k-q]);
					}
//				cout<<l<<" "<<r<<" "<<k<<":"<<f[l][r][k]<<"\n"; 
			}
		}
	}
	cout<<f[1][n][m]<<endl;
	return 0;
}
/*
5 4
0 0 1 0 0
*/

回复

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

正在加载回复...