为什么中间三个点会错啊

P1880 [NOI1995] 石子合并

我找到了,i没有取到n后的点。。。
by Ty_fan @ 2018-01-17 18:48:57


```cpp #include<iostream> #include<cstring> using namespace std; #define maxn 201 int a[201]; int n; int sum[201][201]; int dp[201][201]; int main(){ 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][i]=a[i]; } for(int i=1;i<=2*n-1;i++){ for(int j=i+1;j<=2*n;j++){ sum[i][j]=sum[i][j-1]+a[j]; } } memset(dp,0x7f,sizeof(dp)); for(int i=1;i<=2*n;i++){ dp[i][i]=0; } for(int l=1;l<=n-1;l++){ for(int i=1;i<=2*n;i++){ int j=i+l; if(j<=2*n){ for(int k=i;k<j;k++){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]); } } } } int ans=0x7fffffff; for(int i=1;i<=n;i++){ ans=min(ans,dp[i][i+n-1]); } cout<<ans<<endl; memset(dp,0,sizeof(dp)); for(int l=1;l<=n-1;l++){ for(int i=1;i<=2*n;i++){ int j=i+l; if(j<=2*n){ for(int k=i;k<j;k++){ dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]); } } } } ans=0; for(int i=1;i<=n;i++){ ans=max(ans,dp[i][i+n-1]); } cout<<ans; return 0; } ```
by Ty_fan @ 2018-01-17 19:25:41


```cpp #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,m,a[210],f[222][222],f1[222][222],sum[404];int q=0,ww,e; int main(){ 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]; } for(int l=2;l<=n;l++){//距离 for(int i=1;i<=2*n-l+1;i++){ int j=i+l-1; f[i][j]=999999; f1[i][j]=0; for(int k=i;k<=j-1;k++){ f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i-1]); f1[i][j]=max(f1[i][j],f1[i][k]+f1[k+1][j]+sum[j]-sum[i-1]); } } } int maxl=0,minl=999999999; for(int i=1;i<=n;i++) { maxl=max(maxl,f1[i][i+n-1]); minl=min(minl,f[i][i+n-1]); } cout<<minl<<endl<<maxl; return 0; } ```
by wangjiachi @ 2018-01-17 19:26:00


同样的错误,感谢!!!
by 19reborn @ 2020-02-15 14:12:12


|