090金杭东 - 经典DP.C - [NOIP 2000 提高组] 乘积最大
public
Apr 23, 2025
Never
11
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 }