1 条题解
-
0
C :
#include "stdio.h" int n,a[2000],s[4001]; int max; int m[2000][2001]; int Max(int a,int b) { if(a>b) return a; return b; } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); s[i+1]=s[i]+a[i]; } for(i=n;i<2*n;i++) s[i+1]=s[i]+a[i%n]; for(j=1;j<n;j++) { for(i=0;i<n;i++) m[i][j]=Max(m[(i+1)%n][j-1],m[i][j-1])+s[i+j+1]-s[i]; } max=m[0][n-1]; for(i=0;i<n;i++) { if(max<m[i][n-1]) max=m[i][n-1]; } printf("%d\n",max); return 0; }
C++ :
#include<iostream> #include<cstring> #include<cstdio> using namespace std; long long n,a[4001],sum[4001]={0},f_max[4001][4001]={0}; void init(); void work(); int my_min(int,int); int my_max(int,int); int main() { //freopen("stone5.in","r",stdin); //freopen("stone5.out","w",stdout); init(); work(); return 0; } void init() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i+n]=a[i]; } for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i]; } void work() { for(int d=2;d<=n;d++) { for(int i=1;i<=2*n-d+1;i++) { int j=i+d-1; //f_min[i][j]=0x7fffffff/2; /*for(int k=i;k<j;k++) { f_max[i][j]=my_max(f_max[i][j],f_max[i][k]+f_max[k+1][j]); f_min[i][j]=my_min(f_min[i][j],f_min[i][k]+f_min[k+1][j]); }*/ f_max[i][j]=my_max(f_max[i+1][j],f_max[i][j-1])+sum[j]-sum[i-1]; //f_min[i][j]=my_min(f_min[i+1][j],f_min[i][j-1])+sum[j]-sum[i-1]; //cout<<d<<' '<<sum[j]-sum[i-1]<<' '<<i<<' '<<j<<' '<<f_min[i][j]<<endl; } } long long tot2=0; //for(int i=1;i<=n;i++) tot1=my_min(tot1,f_min[i][i+n-1]); for(int i=1;i<=n;i++) tot2=my_max(tot2,f_max[i][i+n-1]); cout<<tot2<<endl; } int my_min(int x,int y) { if(x<y)return x; else return y; } int my_max(int x,int y) { if(x>y)return x; else return y; }
Pascal :
program acm22948; const maxn=4000; var f:array[1..maxn,1..maxn] of longint; a,sum:array[0..maxn] of longint; d,i,j,k,n,min,max:longint; begin fillchar(sum,sizeof(sum),0); readln(n); for i:=1 to n do begin read(a[i]); a[n+i]:=a[i]; end; for i:=1 to 2*n do sum[i]:=sum[i-1]+a[i]; fillchar(f,sizeof(f),0); for d:=2 to n do for i:=1 to 2*n-d+1 do begin j:=i+d-1; if f[i,i]+f[i+1,j]<f[i,j-1]+f[j,j] then max:=f[i,j-1]+f[j,j] else max:=f[i,i]+f[i+1,j]; f[i,j]:=max+sum[j]-sum[i-1]; end; max:=0; for i:=1 to n do if max<f[i,i+n-1] then max:=f[i,i+n-1]; writeln(max); end.
信息
- ID
- 2172
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者