美文网首页数据结构
洛谷P1880 [NOI1995]石子合并

洛谷P1880 [NOI1995]石子合并

作者: kimoyami | 来源:发表于2018-11-08 16:00 被阅读8次

链接:https://www.luogu.org/problemnew/show/P1880
思路:再次接触区间dp,这次感觉比第一次理解更深入了一些,一般的线性dp是从前往后递推,但有些情形是需要从左右两个小区间合并为一个大区间,这时候就是区间合并问题了,石子合并是最经典的区间合并问题,区间dp首先枚举区间长度,从2开始(1没有意义且会影响最终结果),然后枚举左端点,然后得出右端点,最后枚举中间断层的地方(k表示在第k个数后断开)。对于环形,我们可以把环拆成长度2倍的链,只需要枚举一下链的起点就可以得到换上所有答案的最值。
代码:

#include<bits/stdc++.h>
using namespace std;
int n;
typedef long long ll;
const int maxn = 210;
int a[maxn];
ll maxv[maxn][maxn];
ll minv[maxn][maxn];
ll sum[maxn];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        a[n+i] = a[i];//拆环为链
    }
    for(int i=1;i<=2*n;i++){
        sum[i] = sum[i-1]+a[i];
    }
    for(int i=1;i<=2*n;i++){
        for(int j=1;j<=2*n;j++){
            minv[i][j] = 1e18;
        }
    }
    for(int i=1;i<=2*n;i++)maxv[i][i] = minv[i][i] = 0; 
    for(int len=2;len<=2*n;len++){//从2开始枚举长度(包含左端点本身)
        for(int l=1;l+len-1<=2*n;l++){//枚举左端点
            int r = len+l-1;//得出右端点
            for(int k=l;k<r;k++){//枚举断点(在k的右边断开)
                maxv[l][r] = max(maxv[l][r],maxv[l][k]+maxv[k+1][r]);
                minv[l][r] = min(minv[l][r],minv[l][k]+minv[k+1][r]);         
            }
            //补上合并代价
            maxv[l][r]+=sum[r]-sum[l-1];
            minv[l][r]+=sum[r]-sum[l-1];
        }
    }
    ll res1 = 0,res2 = 1e18;
    for(int i=1;i<=n+1;i++){//找到环上所有方案的最值
        res1 = max(res1,maxv[i][i+n-1]);
        res2 = min(res2,minv[i][i+n-1]);
    }
    printf("%lld\n%lld\n",res2,res1);
    return 0;
}

相关文章

  • DP模板之---区间DP

    一.经典例题 题目地址: 【P1880】[NOI1995]石子合并 - 洛谷 二.分析 转移方程 dp_max[i...

  • 洛谷P1880 [NOI1995]石子合并

    链接:https://www.luogu.org/problemnew/show/P1880思路:再次接触区间dp...

  • [区间dp]石子合并(洛谷P1880)

    传送门 石子合并 AC代码

  • 信息课总结(一)

    贪心与排序 一、合并果子(洛谷ojP1090) 原题是洛谷的P1090 合并果子思路:要使总共的和最小,则要使单次...

  • 腾讯校招-石子合并-c++

    初始一共有n堆石子,每堆石子有w[i]个石子,对石子堆进行合并,每次任意选取两堆石子进行合并。一堆有x个石子的石子...

  • 石子合并问题

    石子合并动态规划解决 在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆...

  • LintCode-区间型动态规划石子归并

    石子归并 有一个石子归并的游戏。最开始的时候,有n堆石子排成一列,目标是要将所有的石子合并成一堆。合并规则如下: ...

  • 石子合并 --- 动态规划

    1.分析题目现要将石子有次序地合并成一堆,要求&条件:规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数...

  • 区间DP

    石子合并 原题链接[https://www.acwing.com/problem/content/284/] 2....

  • 洛谷计划

    洛谷是IT生认可度较高的一个网站,有各种题目以及专业术语,是刷题的一个好地方,但是对基础要求还算挺高,因此需要在...

网友评论

    本文标题:洛谷P1880 [NOI1995]石子合并

    本文链接:https://www.haomeiwen.com/subject/fupwxqtx.html