乘号加号

乘号加号
题解:
显然,这道题类似区间dp又不大一样,限制了乘法计算的数量,所以我们采用分段dp,我们用dp[i][j]表示对前i个元素进行j次乘法的最大值并求出元素的前缀和方便计算
代码:

#include
using namespace std;
int n,a[105],dp[105][105],sum[105],m;
int main(){
     
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
     
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];
		dp[i][0]=sum[i];
	}
	for(int i=1;i<=n;i++){
     
		for(int j=1;j<=min(i-1,m);j++)
			for(int k=1;k<=i;k++) dp[i][j]=max(dp[i][j],dp[k][j-1]*(sum[i]-sum[k]));
	}
	printf("%d",dp[n][m]);
	return 0;	
}

你可能感兴趣的:(c++,动态规划)