牛客假日团队赛10 L 乘积最大(动态规划)

L-乘积最大_牛客假日团队赛10

https://ac.nowcoder.com/acm/contest/1072/L

   首先看一下题意:有一串数字,要求在这串数字中加入k个乘号,使得乘积最大。比如在1231中加入两个乘号,最大的就是。这个题是一道比较基础的动态规划题目,下面说一下我自己的理解。

   我们令dp[i][j]表示前i个数中加入j个乘号的最大值,用num[n][m]表示这串数中从n到m的数值,可以提前预处理下。这里我们让乘号递增,让乘号作为最外层循环。那么我们可以得到状态转移方程:,其中k从j开始,一直加到len-1(字符串长度),因为我们每次多加入一个乘号,就意味着要多一个数字,这个数字必然包括最后一个数字,也就是说这个数字的结尾是确定的,就是i,而开头不确定,所以遍历所有可能的开头位置,找出最大的即可。下面贴一下代码,自己最初用long long挂了,后来用了unsigned long long才过。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int main(){
    ll n,k;
    ll num[45][45];
    ll dp[45][10];
    cin>>n>>k;
    string t;
    cin>>t;
    ll len=t.length();
    memset(dp,0,sizeof(dp));
    for(int q=0;q<len;q++){
        ll tmp=0;
        for(int w=q;w<len;w++){
            tmp=tmp*10+(t[w]-'0');
            num[q][w]=tmp;
        }
    }
    for(int q=0;q<len;q++){
        dp[q][0]=num[0][q];
    }
    for(int q=1;q<=k;q++){
        for(int w=q;w<len;w++){
            for(int l=q-1;l<len;l++){
                dp[w][q]=max(dp[w][q],dp[l][q-1]*num[l+1][w]);
            }
        }
    }
    cout<<dp[len-1][k];
    return 0;
}
全部评论

相关推荐

1.&nbsp;事件概述3月10日下午,华为在“心声社区”发布长达6500字通报,曝光72名正式员工及19名非雇员在非雇员招聘中存在徇私舞弊行为,多人出卖公司信息资产获利,引发热议。-&nbsp;“非雇员”一般指华为OD员工,与人力服务公司签劳动合同,以派遣方式到华为工作,薪资待遇与华为内部员工基本一致,可通过考核转正。2.&nbsp;相关传言与真相华为相关人士称暂无官方回应,很多传言细节不准确。&nbsp;华为成都研究所员工透露,此次通报主要涉及成都研究所的数据存储部门,整个数据存储业务约100余人,此次明文通报除名辞退或通报批评的有62名,“很多部门基本全开除”&nbsp;。网传任正非亲赴成都、封楼抓人等消息不实。早在2024年年中,就有...
七安有出处嘛:省流:任正非亲赴成都等消息不实,2024 年年中就有人举报了;涉及36名违规当事人,其中有13人被除名;10人有主动申报情节或情节较严重的,予以辞退处理;另有13人被劝退、个人职级降3等。另外还有26名相关管理责任人作为直接或间接管理者,被处以个人职级降6等,冻结个人涨薪、职级晋升、干部向上任命,冻结期6—12个月不等;若下属违规偶发,则仅通报批评。并没有释放100HC😂😂😂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务