CODEVS 1017乘积最大

本文介绍了一个使用记忆化搜索解决的最大乘积问题。通过递归的方式,在字符串中插入指定数量的乘号来获得最大的可能乘积。该程序利用了状态转移方程进行高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<iostream>
using namespace std;
char aa[50];
int a[50],f[50][50][10],k,n;
long long chengji(int x,int y){
    long long sum=0;
    for(int i=x;i<=y;i++) sum=sum*10+a[i];
    return sum;
}
long long d(int i,int j,int k){
    int mmax=0,t=0;
    if(f[i][j][k]>0) return f[i][j][k];
    else if(k==0) return chengji(i,j);//没有乘号了,返回i~j的整数(合起来)
    else{
        for(int l=i;l<j;l++){
            for(int tk=0;tk<k;tk++){
                int tki_l=tk;//左区间的乘号数
                int tkl_j=k-tk-1;//右区间的乘号数
                if(tki_l>(l-i)||tkl_j>(j-(l+1))) continue;//如果乘号数大于可插入乘号的位置,则跳过
                else{//满足条件
                    t=d(i,l,tki_l)*d(l+1,j,tkl_j);
                    mmax=t>mmax?t:mmax;
                }
            }
        }
        return f[i][j][k]=mmax;
    }

}
int main(){
    freopen("1017.in","r",stdin);
    freopen("1017.out","w",stdout);
    cin>>n>>k;
    scanf("%s",aa);
    for(int i=1;i<=n;i++) a[i]=(aa[i-1]-'0');
    cout<<d(1,n,k);
    return 0;
}

题解:记忆化搜索,状态转移方程:d(i,j,k)=max{d(i,l,tk)*d(l+1,j,k-tk-1) | 0 < = tk < k , 0 <= l < j }. d(i,j,k)表示从i到j中插入k个乘号所得的最大值。
注意:状态转移方程要点即是状态描述完整简洁,保证不重不漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值