P1018 [NOIP2000 提高组] 乘积最大
递推方程显然-》高精即可
高精 -》 将数倒置存储
-》递推方程 -》边界条件
/* 4 2 1231 62 6 2 356510 107100 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; int n,K,a[100]; string s; struct lxt { int len,ans[100]; }dp[100][100]; lxt cal(lxt x,int l,int r) { lxt Ans,y; memset(Ans.ans,0,sizeof(Ans.ans)); memset(y.ans,0,sizeof(y.ans)); for(int i=1;i<=r-l+1;i++) y.ans[i]=a[r-i+1]; int lenx=x.len,leny=r-l+1; for(int i=1;i<=lenx;i++) for(int j=1;j<=leny;j++) Ans.ans[i+j-1]+=x.ans[i]*y.ans[j];// !!! for(int i=1;i<=lenx+leny-1;i++) { Ans.ans[i+1]+=Ans.ans[i]/10; Ans.ans[i]=Ans.ans[i]%10; } if(Ans.ans[lenx+leny]) Ans.len=lenx+leny; else Ans.len=lenx+leny-1; return Ans; } lxt cmp(lxt x,lxt y) { int len1=x.len,len2=y.len; if(len1<len2) return y; if(len1>len2) return x; for(int i=len1;i>=1;i--) { if(x.ans[i]>y.ans[i]) return x; if(x.ans[i]<y.ans[i]) return y; } return x; } int main() { ios::sync_with_stdio(false); cin>>n>>K; cin>>s; for(int i=1;i<=n;i++) a[i]=s[i-1]-'0'; for(int i=1;i<=n;i++) for(int j=i;j>=1;j--) dp[0][i].ans[ ++dp[0][i].len ]=a[j]; for(int i=2;i<=n;i++) for(int k=1;k<=min(K,i-1);k++) for(int j=k;j<i;j++) dp[k][i]=cmp( dp[k][i],cal(dp[k-1][j],j+1,i) ); for(int i=dp[K][n].len;i>=1;i--) cout<<dp[K][n].ans[i]; cout<<endl; return 0; } /* #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100; int n,K; string s; int a[maxn]; struct lxt { int len; int ans[maxn]; }dp[maxn/10][maxn]; lxt cal(lxt x,int l,int r) { lxt Ans,y; memset(Ans.ans,0,sizeof(Ans.ans)); memset(y.ans,0,sizeof(y.ans)); y.len=r-l+1; for(int i=r;i>=l;--i) y.ans[r-i+1]=a[i]; int l1=x.len,l2=y.len,ll; for(int i=1;i<=l1;++i) for(int j=1;j<=l2;++j) Ans.ans[i+j-1]+=x.ans[i]*y.ans[j]; ll=l1+l2-1; for(int i=1;i<=ll;++i) { Ans.ans[i+1]+=Ans.ans[i]/10; Ans.ans[i]=Ans.ans[i]%10; } if(Ans.ans[ll+1]) ll++; Ans.len=ll; return Ans; } lxt cmp(lxt x,lxt y) { int lx=x.len,ly=y.len; if(lx<ly) return y; if(lx>ly) return x; for(int i=lx;i>=1;--i) { if(x.ans[i]>y.ans[i]) return x; if(x.ans[i]<y.ans[i]) return y; } return x; } int main() { scanf("%d%d",&n,&K); cin>>s; for(int i=1;i<=n;++i) a[i]=s[i-1]-'0'; for(int i=1;i<=n;++i) for(int j=i;j>=1;--j) dp[0][i].ans[++dp[0][i].len]=a[j]; for(int i=2;i<=n;++i) for(int k=1;k<=min(K,i-1);++k) for(int j=k;j<i;++j) dp[k][i]=cmp(dp[k][i],cal(dp[k-1][j],j+1,i)); for(int i=dp[K][n].len;i>=1;--i) printf("%d",dp[K][n].ans[i]); return 0; } */

浙公网安备 33010602011771号