1 条题解
-
0
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 :
uses math; var f1,f2,c:array[0..1001,0..1001]of longint; a,b:array[0..1001]of longint; i,j,x,beg,n,k,ans1,ans2:longint; begin readln(n,k); for i:=1 to n do begin readln(a[i]); a[i]:=a[i] mod 10+10; a[i+n]:=a[i]; end; ans1:=maxlongint; ans2:=-maxlongint; for beg:=1 to n do begin for i:=1 to n do b[i]:=a[i+beg-1]; fillchar(c,sizeof(c),0); for i:=1 to n do for j:=i to n do c[i,j]:=((c[i,j-1]+b[j]) mod 10+10) mod 10; fillchar(f1,sizeof(f1),$7f); fillchar(f2,sizeof(f2),0); for i:=1 to n do begin f1[i,1]:=c[1,i]; f2[i,1]:=c[1,i]; end; for j:=2 to k do for i:=j to n do for x:=j-1 to i-1 do begin f1[i,j]:=min(f1[x,j-1]*c[x+1,i],f1[i,j]); f2[i,j]:=max(f2[x,j-1]*c[x+1,i],f2[i,j]); end; ans1:=min(ans1,f1[n,k]); ans2:=max(ans2,f2[n,k]); end; writeln(ans1); writeln(ans2); end.
- 1
信息
- ID
- 1943
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者