高精度乘法+DP
2025-10-03 00:37:14
发布于:广东
1阅读
0回复
0点赞
令表示对于前个字符,插入个乘号所能获得的最大值,显然区间DP
#include<bits/stdc++.h>
using namespace std;
int n,k;
vector<int> a;
vector<vector<vector<int> > > dp(45,vector<vector<int> >(10)),num(45,vector<vector<int> >(45));
vector<int> operator * (vector<int> A,vector<int> B) //I hate high precision 我恨高精度
{
vector<int> C(A.size()+B.size(),0);
for (int i=0;i<A.size();i++)
{
for (int j=0;j<B.size();j++)
{
C[i+j]+=A[i]*B[j];
C[i+j+1]+=C[i+j]/10;
C[i+j]%=10;
}
}
while (C.size()>1 && C.back()==0) C.pop_back();
return C;
}
bool operator < (vector<int> A,vector<int> B)
{
if (A.size()!=B.size()) return A.size()<B.size();
for (int i=A.size()-1;i>=0;i--)
{
if (A[i]!=B[i])
return A[i]<B[i];
}
return 0;
}
vector<int> max(vector<int> A,vector<int> B)
{
return (A<B ? B:A);
}
int main()
{
string s;
cin >> n >> k >> s;
for (int i=s.size()-1;i>=0;i--)
a.push_back(s[i]-'0');
for (int i=0;i<n;i++)
{
num[i][i].push_back(a[i]);
for (int j=i+1;j<n;j++)
num[i][j]=num[i][j-1],num[i][j].push_back(a[j]);
}
for (int i=0;i<n;i++)
dp[i][0]=num[0][i];
for (int i=0;i<n;i++)
{
for (int j=1;j<=k;j++)
{
for (int l=i;l>0;l--)
dp[i][j]=max(dp[i][j],dp[l-1][j-1]*num[l][i]);
}
}
for (auto it=dp[n-1][k].end()-1;it>=dp[n-1][k].begin();it--)
cout << *it;
return 0;
}
这里空空如也





有帮助,赞一个