1 条题解

  • 0
    @ 2025-2-14 21:20:42

    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
    上传者