40分,求调

P1880 [NOI1995] 石子合并

#### 你写好看点不就对了吗 ``` #include<bits/stdc++.h> using namespace std; const int N=203,INF=0x7f7f7f7f; int n,a[N],dp1[N][N],dp2[N][N],sum[N],minn=INF,maxn=-INF; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ for(int j=i;j<=n<<1;++j){ dp1[i][j]=dp1[i+n][j]=INF; dp2[i][j]=dp2[i+n][j]=-INF; } scanf("%d",&a[i]); a[i+n]=a[i]; dp1[i][i]=dp1[i+n][i+n]=dp2[i][i]=dp2[i+n][i+n]=0; } for(int i=1;i<=n<<1;++i) sum[i]=sum[i-1]+a[i]; for(int i=1;i<n;++i){ //向后走i个 for(int j=1;j+i<=n*2+1;++j){ int r=j+i; for(int k=j;k<r;++k){ dp1[j][r]=min(dp1[j][r],dp1[j][k]+dp1[k+1][r]+sum[r]-sum[j-1]); dp2[j][r]=max(dp2[j][r],dp2[j][k]+dp2[k+1][r]+sum[r]-sum[j-1]); } } } for(int i=1;i<=n;++i) minn=min(minn,dp1[i][i+n-1]),maxn=max(maxn,dp2[i][i+n-1]); printf("%d\n%d",minn,maxn); return 0; } ```
by wenyutao1 @ 2023-08-26 21:30:59


@[wenyutao1](/user/751546) 你上面一份代码是这么写的: ```cpp for(int i=1;i<n;++i){ for(int j=1;j<=n;++j){ //枚举是起点 ``` 下面一份是这么写的: ```cpp for(int i=1;i<n;++i){ //向后走i个 for(int j=1;j+i<=n*2+1;++j){ ``` 所以有差别,一个40一个100。 要问我怎么知道的?因为我也是按你上面那么写的hh,多亏你我才AC。
by retamian @ 2023-10-03 15:10:19


@[retamian](/user/1033360) OK,OK;
by wenyutao1 @ 2023-10-04 22:52:29


|