1 solutions
-
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; }
- 1
Information
- ID
- 10059
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By