1 条题解
-
0
C++ :
#include<iostream> #include<cstdio> using namespace std; int h[41]={0}; long long n,m,k; long long s[41][41]={0}; long long f[41][41]={0}; void init(); void work(); int main() { init(); work(); return 0; } void init() { scanf("%d%d",&n,&k); cin>>m; for(int i=n;i>=1;--i) { h[i]=m%10; m/=10; s[i][i]=h[i]; } for(int i=1;i<n;++i) { for(int j=i+1;j<=n;++j) { s[i][j]=s[i][j-1]*10+h[j]; } } for(int i=1;i<=n;++i) { f[i][0]=s[1][i]; } } void work() { for(int v=1;v<=k;++v) { for(int i=v+1;i<=n;++i) { for(int j=v;j<i;++j) { if(f[j][v-1]*s[j+1][i]>f[i][v]) { f[i][v]=f[j][v-1]*s[j+1][i]; } } } } cout<<f[n][k]; }
Pascal :
program p22968; var f,sum:array[0..30,0..30]of int64; i,j,k,ll,n,m,all,h,l:longint; s:string; w:int64; ans:array[0..30]of longint; function min(x,y:longint):longint; begin if x>y then exit(y)else exit(x); end; {procedure find(x,y:longint); var i,j:longint; flag:boolean; begin flag:=false; if y=0 then exit; for i:=1 to x-1 do if (f[i,y-1]*sum[i+1,x]=f[x,y])and(not flag) then begin flag:=true; find(i,y-1); inc(h); ans[h]:=i; end; end;} begin fillchar(f,sizeof(f),0); fillchar(sum,sizeof(sum),0); readln(m,n); inc(n); readln(s); i:=1; while i<=length(s) do begin for j:=i to length(s) do sum[i,j]:=sum[i,j-1]*10+ord(s[j])-ord('0'); inc(i); end; for i:=1 to m do f[i,0]:=sum[1,i]; for i:=2 to m do for j:=1 to min(i-1,n-1) do begin w:=-maxlongint; for k:=1 to i-1 do if w<f[k,j-1]*sum[k+1,i] then w:=f[k,j-1]*sum[k+1,i]; f[i,j]:=w; end; writeln(f[m,n-1]); { if n=1 then writeln(sum[1,m]) else begin l:=1; h:=0; find(m,n-1); write(sum[1,ans[1]],' '); l:=ans[1]+1; for i:=2 to h do begin write(sum[l,ans[i]],' '); l:=ans[i]+1; end; writeln(sum[l,m]); end;} end.
- 1
信息
- ID
- 836
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者