1569:石子合併

 

方程:dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1] 

環形 dp 模板題 

const int N=400+5;

    int n,m,t;
    int i,j,k;
    int a[N];
    int sum[N],dp_max[N][N],dp_min[N][N];
    
int main()
{
    IOS;
    while(cin>>n){
        for(i=1;i<=n;i++){
            cin>>a[i];
            a[n+i]=a[i];
        }
        sum[0]=0;
        for(i=1;i<=2*n;i++){
            sum[i]=sum[i-1]+a[i];
            dp_max[i][i]=dp_min[i][i]=0;
        }

        for(int len=2;len<=n;len++){
            for(i=1;i+len-1<=2*n;i++){
                j=i+len-1;
                dp_min[i][j]=inf,dp_max[i][j]=0;
                for(k=i;k<j;k++){
                    dp_min[i][j]=min(dp_min[i][k]+dp_min[k+1][j],dp_min[i][j]);
                    dp_max[i][j]=max(dp_max[i][k]+dp_max[k+1][j],dp_max[i][j]);
                }
                int tmp=sum[j]-sum[i-1];
                dp_max[i][j]+=tmp;
                dp_min[i][j]+=tmp;
            }
        }
        int maxx=0,minn=inf;
        for(i=1;i<=n;i++){
            maxx=max(maxx,dp_max[i][i+n-1]);
            minn=min(minn,dp_min[i][i+n-1]);
        }
        cout<<minn<<endl;
        cout<<maxx<<endl;
    }
    //PAUSE;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章