wikioi 1017 乘积最大

本文介绍了一种求解字符串中通过插入乘号得到的最大乘积值的算法。该算法使用动态规划方法,通过预处理得到子串的数值表示,并以此为基础计算不同分割方式下所能获得的最大乘积。

dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]);

dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <ctime>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <set>
 8 #include <vector>
 9 #include <sstream>
10 #include <queue>
11 #include <typeinfo>
12 typedef long long ll;
13 using namespace std;
14 char str[10010];
15 ll mapn[50][50];
16 int main()
17 {
18     int n,m;
19     cin>>n>>m;
20     cin>>str;
21     for(int i=0;i<n;i++)
22     {
23         int mm;
24         mm=0;
25         for(int j=i;j<n;j++)
26         {
27             mm=mm*10+str[j]-'0';
28             mapn[i][j]=mm;
29         }
30     }
31     ll dp[51][10];
32     memset(dp,0,sizeof(dp));
33     for(int i=0;i<n;i++)
34         dp[i][0]=mapn[0][i];
35     for(int i=0;i<n;i++)
36     {
37         for(int k=1;k<=m;k++)
38         {
39             for(int t=0;t<i;t++)
40             {
41                 dp[i][k]=max(dp[i][k],dp[t][k-1]*mapn[t+1][i]);
42             }
43         }
44     }
45     cout<<dp[n-1][m]<<endl;
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/qscqesze/p/4011002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值