首页 > 其他 > 详细

P1880 [NOI1995]石子合并

时间:2020-02-23 14:06:50      阅读:45      评论:0      收藏:0      [点我收藏+]

经典区间dp,破环成链,枚举新起点与新终点即可(i,i+n-1)

技术分享图片
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
typedef pair<int,int> pii;

const int INF = 0x3f3f3f3f;
const int maxn = 205;
int Max[maxn][maxn];
int Min[maxn][maxn];
int sum[maxn], buf[maxn];


void run_case() {
    int n; cin >> n;
    for(int i = 1; i <= n; ++i) {
        int t; cin >> buf[i];
        buf[i+n] = buf[i];
    }
    for(int i = 1; i <= n+n; ++i) sum[i] = sum[i-1] + buf[i];
    for(int m = 1; m < n; ++m) {
        for(int i = 1, j = i + m; i < n+n && j < n+n; ++i, j = i+m) {
            Min[i][j] = INF;
            for(int k = i; k < j; ++k) {
                Max[i][j] = max(Max[i][j], Max[i][k] + Max[k+1][j] + sum[j] - sum[i-1]);
                Min[i][j] = min(Min[i][j], Min[i][k] + Min[k+1][j] + sum[j] - sum[i-1]);
            }
        }
    }
    int aMin = INF, aMax = -1;
    for(int i = 1; i <= n; ++i) {
        aMin = min(Min[i][i+n-1], aMin);
        aMax = max(aMax, Max[i][i+n-1]);
    }
    cout << aMin << "\n" << aMax;
}
 
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cout.flags(ios::fixed);cout.precision(10);
    //int t; cin >> t;
    //while(t--)
    run_case();
    cout.flush();
    return 0;
}
View Code

 

P1880 [NOI1995]石子合并

原文:https://www.cnblogs.com/GRedComeT/p/12348839.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!