G

090金杭东 - 经典DP.C - [NOIP 2000 提高组] 乘积最大

public
Guest Apr 23, 2025 Never 11
Clone
C++ 090金杭东 - 经典DP.C - [NOIP 2000 提高组] 乘积最大 61 lines (59 loc) | 1.28 KB
1
/*
2
4 2
3
2008
4
正确 0
5
输出 00
6
*/
7
#include<bits/stdc++.h>
8
#define int long long
9
using namespace std;
10
const int N=45;
11
int n,p;
12
string dp[N][N];
13
string num[N][N];
14
string s;
15
string mul(string a,string b)
16
{
17
string t="";
18
int x[105],y[105],c[105],lena,lenb,lenc;
19
memset(c,0,sizeof(c));
20
lena=a.size(),lenb=b.size();
21
for(int i=1;i<=lena;++i) x[i]=a[lena-i]-48;
22
for(int i=1;i<=lenb;++i) y[i]=b[lenb-i]-48;
23
for(int i=1;i<=lena;++i)
24
for(int j=1;j<=lenb;++j) c[i+j-1]+=x[i]*y[j];
25
lenc=lena+lenb;
26
for(int i=1;i<=lenc;++i)
27
{
28
c[i+1]+=c[i]/10;
29
c[i]%=10;
30
}
31
if(!c[lenc]) lenc--;
32
for(int i=lenc;i>=1;--i) t+=char(c[i]+48);
33
return t;
34
}
35
string exmax(string a,string b)
36
{
37
while(a.size() > 1 && a[0]=='0') // 消除 前导零
38
a = a.substr(1);
39
40
while(b.size() > 1 && b[0]=='0') // 消除 前导零
41
b = b.substr(1);
42
43
if(a.size()>b.size()) return a;
44
if(b.size()>a.size()) return b;
45
if(a>b) return a;
46
return b;
47
}
48
signed main()
49
{
50
cin>>n>>p;
51
cin>>s;
52
s=" "+s;
53
for(int i=1;i<=n;++i)
54
for(int j=i;j<=n;++j) num[i][j]=num[i][j-1]+s[j];
55
for(int i=1;i<=n;++i) dp[i][0]=num[1][i];
56
for(int i=1;i<=n;++i)
57
for(int j=1;j<=p;++j)
58
for(int k=1;k<i;++k) dp[i][j]=exmax(dp[i][j],mul(dp[k][j-1],num[k+1][i]));
59
cout<<dp[n][p];
60
return 0;
61
}