1 条题解

  • 0
    @ 2025-9-9 23:53:29

    C++ :

    #include <stdio.h>  
    #include <string.h>  
    #define MAX 10000000  
    #define MIN -10000000  
    int line[200],n,m,Min,Max,sum[200];  
    int f[200][20];//f[i][j]=第1-i个数分成j份,结果最大值  
    int g[200][20];//g[i][j]=第1-i个数分成j份,结果最小值  
    int min(int a,int b)  
    {  
        if(a>b)  
            return b;  
        return a;  
    }  
    int max(int a,int b)  
    {  
        if(a>b)  
            return a;  
        return b;  
    }  
    void dp(int a[])  
    {  
        int i,j,k;  
        for(i=1;i<=n;i++)  
            sum[i]=sum[i-1]+a[i];  
        for(i=0;i<=n;i++)  
            for(j=0;j<=m;j++)  
            {  
                f[i][j]=0;  
                g[i][j]=-1u>>1;  
            }  
        for(i=1;i<=n;i++)  
        {  
            f[i][1]=g[i][1]=(sum[i]%10+10)%10;  
        }  
        f[0][0]=1;  
        g[0][0]=1;  
        for(j=2;j<=m;j++)  
        {  
            for(i=j;i<=n;i++)  
            {  
                for(k=j-1;k<i;k++)  
                {  
                    {  
                        f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                        g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                    }  
                }  
            }  
        }  
        Max=max(Max,f[n][m]);  
        Min=min(Min,g[n][m]);  
    }  
    int main()  
    {  
        //freopen("game.in","r",stdin);
        //freopen("game.out","w",stdout);
        int i,j,k;  
        Max=0;  
        Min=-1u>>1;  
        scanf("%d%d",&n,&m);  
        for(i=1;i<=n;i++)  
        {  
            scanf("%d",&line[i]);  
            line[i+n]=line[i];  
        }  
        for(i=0;i<n;i++)  
            dp(line+i);  
        printf("%d\n%d\n",Min,Max);  
        return 0;  
    }  
    

    Pascal :

    var
        a,atmp:array[0..50] of longint;
        f:array[0..9,0..50] of longint;
        n,m,i:longint;
    function g(a,b:longint):longint;
    var
        i:longint;
    begin
        g:=0;
        for i:=a to b do
            if atmp[i]>0 then g:=g+atmp[i]
            else g:=g+atmp[i];
        g:=(g+100000) mod 10;
    end;
    procedure question_min;
    var
        t,i,j,k,tmp,min:longint;
    begin
        min:=maxlongint;
        for t:=1 to n do
        begin
            for i:=1 to n do atmp[i]:=a[(i+t-1) mod n];
            atmp[n-t+1]:=a[n];f[0,1]:=atmp[1];
            for i:=1 to n do f[0,i]:=g(1,i);
            for i:=1 to m-1 do
                for j:=i+1 to n do
                begin
                    f[i,j]:=maxlongint;
                    for k:=i to j-1 do
                    begin
                        tmp:=g(k+1,j);
                        if f[i,j]>tmp*f[i-1,k] then f[i,j]:=tmp*f[i-1,k];
                    end;
                end;
            if f[m-1,n]<min then min:=f[m-1,n];
        end;
        writeln(min);
    end;
    procedure question_max;
    var
        t,i,j,k,tmp,max:longint;
    begin
        max:=0;
        for t:=1 to n do
        begin
            for i:=1 to n do atmp[i]:=a[(i+t-1) mod n];
            atmp[n-t+1]:=a[n];f[0,1]:=atmp[1];
            for i:=1 to n do f[0,i]:=g(1,i);
            for i:=1 to m-1 do
                for j:=i+1 to n do
                begin
                    f[i,j]:=0;
                    for k:=i to j-1 do
                    begin
                        tmp:=g(k+1,j);
                        if f[i,j]<tmp*f[i-1,k] then f[i,j]:=tmp*f[i-1,k];
                    end;
                end;
            if f[m-1,n]>max then max:=f[m-1,n];
        end;
        writeln(max);
    end;
    begin
    {assign(input,'game.in');reset(input);
     assign(output,'game.out');rewrite(output);}
        readln(n,m);
        for i:=1 to n do readln(a[i]);
        question_min;
        question_max;
    {close(input);
     close(output);}
    end.
    
    
    • 1

    信息

    ID
    1668
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者