求助20分

P1018 [NOIP2000 提高组] 乘积最大

我也求助20分 ```cpp #include <cstdio> #include <algorithm> using namespace std; int i,j,l,p,n,k,a[41],f[41] [7],maxf; long long t,maxt; char s[41]; int main() { scanf("%d%d",&n,&k); for(i=1;i<=n;i++) { scanf(" %c",&s[i]); a[i]=s[i]-'0'; } for(i=0;i<=k+1;i++) f[0][i]=1; for(t=0,i=1;i<=n;i++) { t=t*10+a[i]; f[i][1]=t; } for(i=1;i<=n;i++) for(j=2;j<=k+1;j++) { for(maxt=0,l=i-1;l>=j-1;l--) { for(t=0,p=l+1;p<=i;p++) t=t*10+a[p]; if(f[l][j-1]*t>maxt) maxt=f[l][j-1]*t; } f[i][j]=maxt; } printf("%d",f[n][k+1]); return 0; } ```
by Mutsumi_0114 @ 2018-01-26 23:04:47


我也20分 ```cpp #include<bits/stdc++.h> using namespace std;const int maxn=101;long long n,k;char s[maxn]; long long sum[maxn][maxn],f[maxn][maxn]; int main(){ cin>>n>>k;for(int i=1;i<=n;i++)cin>>s[i]; for(int i=1;i<=n;i++)sum[i][i]=s[i]^48;for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)sum[i][j]=sum[i][j-1]*10+(s[j]^48); // for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)cout<<sum[i][j]<<'\n'; for(int i=1;i<=n;i++)f[i][0]=sum[1][i]; for(int i=1;i<=k;i++)for(int j=i+1;j<=n;j++)for(int q=i;q<j;q++)f[j][i]=max(f[j][i],f[q][i-1]*sum[q+1][j]); printf("%d\n",f[n][k]); } ```
by 赵灵儿 @ 2018-03-22 11:35:57


```cpp #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define Fast register #define read(s) scanf("%d",&s) #define write(s) printf("%d",s) #define max(a,b) a<b?b:a const int maxn=1e5+6; const int inf=0x3f3f3fll; char buf[1<<14]; struct big{ int s[2333],len; big(){memset(s,0,sizeof(s));len=1;} inline void del_0() { while(len>1&&s[len]==0) len--; return; } inline void In() { char ptr[2333]; scanf("%s",ptr); len=strlen(ptr); for(Fast int i=1;i<=len;i++) s[i]=ptr[len-i]-48; return; } inline void Out() { for(Fast int i=len;i>0;i--) printf("%d",s[i]); // putchar('\n'); return; } bool operator<(const big&r) const { if(len!=r.len) return len<r.len; for(Fast int i=len;i>0;i--) { if(s[i]<r.s[i]) return 1; else if(s[i]>s[i]) return 0; } return 0; } inline void push(Fast int r) { len=0; memset(s,0,sizeof(s)); for(Fast int i=r;i>0;i/=10) s[++len]=i%10; del_0(); return; } big operator*(const big&r) const { big res; res.len=len+r.len+23; for(Fast int i=1;i<=len;i++) for(Fast int j=1;j<=r.len;j++) res.s[i+j-1]=s[i]*r.s[j]; for(Fast int k=1;k<=res.len;k++) { res.s[k+1]+=res.s[k]/10; res.s[k]%=10; } if(res.s[res.len+1]>0) res.len++; res.del_0(); return res; } }dp[50][50],a,b; int n,data[233],k; char ch[233]; big get_int(Fast int l,Fast int r) { big res; res.len--; for(Fast int i=r;i>=l;i--) res.s[++res.len]=data[i]; res.del_0(); return res; } int main() { read(n),read(k); scanf("%s",ch); for(Fast int i=1;i<=n;i++) data[i]=ch[i-1]-48; //write(n),putchar(32),write(k),putchar(10); for(Fast int i=1;i<=n;i++) dp[i][0]=get_int(1,i); for(Fast int i=1;i<=n;i++) { for(Fast int j=1;j<=min(i-1,k);j++) { for(Fast int t=j;t<j;t++) dp[i][j]=max(dp[i][j],dp[i][j-1]*get_int(t+1,i)); } } for(Fast int i=0;i<=n;i++) { for(Fast int j=0;i<=k;i++) dp[i][j].Out(); putchar(32); } dp[n][k].Out(); return 0; } ```
by Explorer_CYC @ 2018-04-22 16:25:19


要写高精度的
by XeCtera @ 2018-04-29 20:48:17


我把类型开到极限也只有50分
by XeCtera @ 2018-04-29 20:48:58


我也20分 #include<iostream> #include<iomanip> #include<cmath> #include<string> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int s[1005][1005],f[1005][1005]; char a[1005]; int N,K; void ddd() { for(int i=1;i<=N;i++) for(int j=i;j<=N;j++) s[i][j]=s[i][j-1]*10+a[j]-'0'; for(int i=1;i<=N;i++) f[i][0]=s[1][i]; /*for(int i=1;i<=N;i++) { for(int j=i;j<=N;j++) cout<<s[i][j]<<" "; cout<<endl; }*/ } int main() { cin>>N>>K; for(int i=1;i<=N;i++)cin>>a[i]; ddd(); for(int k=1;k<=K;k++) for(int i=1;i<=N;i++) for(int j=0;j<=i-1;j++) f[i][k]=max(f[i][k],f[j][k-1]*s[j+1][i]); cout<<f[N][K]; return 0; }
by bs2019lixuheng @ 2018-05-03 19:39:22


|