蓝桥杯 最大的算式 DP

//#include<bits/stdc++.h>
//using namespace std;
//int main(){
//	int n,k;
//	cin>>n>>k;
//	int Saver[n];
//	for(int i=0;i<n;i++){
//		cin>>Saver[i]; 
//	} 
//	sort(Saver,Saver+n);
//	long long ans=0;
//	for(int i=0;i<n-k;i++){
//		ans+=Saver[i];
//	}
//	for(int i=n-k;i<n;i++){
//		ans*=Saver[i];
//	}
//	cout<<ans;
//	return 0;
//} //55分,毫无根据地贪心,竟然55分,搜索杯改贪心杯?? 
#include<iostream>  
#include<algorithm>  
using namespace std;  
long long dp[16][16]; //dp[i][j]表示前i个使用j个乘号的最优解 

//定义最优解,观察其子结构的时候,考察最后一个乘号的位置,非常关键。
//这里不论证如果出现一堆加号,就把他们用括号括起来啦,大家自己捉摸。 
long long ans[16];  
void init(int n,int k)  
{  
    long long num;  
    long long sum=0;  
    for(int i=1;i<=n;i++)  
    {  
        scanf("%lld",&num);  
        ans[i]=num;  
        sum+=num;  
        dp[i][0]=sum;//在没有使用乘号的情况全部使用加法  
    }  
}  
int main()  
{  
    int n,k;  
    scanf("%d%d",&n,&k);  
    init(n,k);  
    for(int i=1;i<=n;i++)//n个数  
    {  
        for(int j=1;j<=i-1;j++)//最多有i-1个乘号,数量级较小,就不剪枝了  
        {  
            for(int p=2;p<=i;p++)//第j个乘号插入的位置,如果和前面的乘号位置重叠了,也不影响,还是原来的dp[i][j]  
            {  
                dp[i][j]=max(dp[i][j],dp[p-1][j-1]*(dp[i][0]-dp[p-1][0]));//从车如位置到i的和,一起乘总比一个乘要大  
            }  
        }  
    }  
    printf("%lld\n",dp[n][k]);  
    return 0;  
}  
 

参考了算法训练 最大的算式 DP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值