题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分。

分析 : 

有大佬给出了四边形不等式优化........

发现并不会,于是开始学习区间DP的写法

对于某一个特定的区间 (i, j) 其合并成一个石子是从

某两个属于这个区间且连续不相交区间合并而来

即假设有断点 k 则 (i, j) = (i, k) + (k+1, j) + Sum(i, j)

这里定义 Sum(i, j) 为 i 到 j 这个区间石子的总和、前缀和可实现

只要枚举断点就可以知道 (i, j) 的最优值是多少了

定义 dp[i][j] = 区间 i 到 j 的石子合并代价的最值

转移方程就是枚举断点 dp[i][j] = dp[i][k] + dp[k+1][j] + Sum(i, j)

但是这个有一个坑,如果你用三重循环,分别表示

区间开头 i、区间结尾 j、区间断点 k 来进行 状态转移

这样是错误的,因为 dp[k+1][j] 在这样的循环下是还未确定的

所以有个技巧就是将一重循环变成区间长度,即

区间长度 len、区间开头 i、区间断点 k

还有一个问题就是,题目给出来的石头是链装的

只要“断环为链”即复制一份黏到末尾就行了

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
;
int dp1[maxn][maxn], dp2[maxn][maxn];
int PreSum[maxn];
int arr[maxn];
int N;

int main(void)
{
    scanf("%d", &N);

    memset(dp1, , sizeof(dp1));
    memset(dp2, , sizeof(dp2));
    memset(PreSum, , sizeof(PreSum));

    ; i<=N; i++){
        scanf("%d", &arr[i]);
        arr[i+N] = arr[i];
    }

    ; i<=(N<<); i++)
        PreSum[i] = PreSum[i-] + arr[i];

    ; len<=N; len++){
        ; i<=(N<<)-len+; i++){
            ;
            , MM = INF;
            for(int k=i; k<j; k++){
                MM = min(MM, dp1[i][k]+dp1[k+][j]+PreSum[j]-PreSum[i-]);
                MX = max(MX, dp2[i][k]+dp2[k+][j]+PreSum[j]-PreSum[i-]);
            }
            dp1[i][j] = MM;
            dp2[i][j] = MX;
        }
    }

    , MM = INF;
    ; i<=N; i++){
        MM = min(MM, dp1[i][i+N-]);
        MX = max(MX, dp2[i][i+N-]);
    }

    printf("%d\n%d\n", MM, MX);
    ;
}

洛谷 P1080 石子合并 ( 区间DP )的更多相关文章

  1. 洛谷P1880 石子合并(区间DP)(环形DP)

    To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...

  2. 洛谷 P1880 [NOI1995] 石子合并(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...

  3. 洛谷P1880 石子合并(环形石子合并 区间DP)

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  4. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  5. 石子合并 区间dp模板

    题意:中文题 Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合 ...

  6. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  7. 洛谷 P1880 石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  8. 洛谷P1040 加分二叉树(区间dp)

    P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...

  9. 石子合并 区间DP模板题

    题目链接:https://vjudge.net/problem/51Nod-1021 题意 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石 ...

随机推荐

  1. (转)使用JMeter对秒杀示例进行性能测试

    背景 秒杀是我们ServiceComb开源团队以领域驱动设计(DDD)为背景,从零开始构建一个微服务架构的示例项目:在<秒杀开发历程>系列博文中提到它作为一个高并发压力场景的应用,采用了C ...

  2. python 并发编程 多线程 GIL与多线程

    GIL与多线程 有了GIL的存在,同一时刻同一进程中只有一个线程被执行 多进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势 1.cpu到底是用来做计算的,还是用来做I/ ...

  3. CSRF-DVWA_1.9-笔记

     CSRF : Cross-site request forgery  跨站请求伪造   所用到的工具: Firefox浏览器及其插件     HackBar(快速构造URL)     和     T ...

  4. C语言Ⅰ博客作业05

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9827 我在这个课程的目 ...

  5. springboot - 应用实践(3)springboot的核心

    1.springboot的启动类与核心注解@SpringBootApplication 2.springboot基本配置 3.springboot自动配置原理

  6. 多次NameNode执行format后DataNode启动不了解决方案

    1.问题 执行start-dfs.sh后在进程中查看jps,发现NameNode启动,但DataNode没有 2.原因 在失败的.log文件中看到datanode的clusterID 和 nameno ...

  7. mysql生成全局id(转)

    由于数据量以及IO效率的因素,很多项目对数据支持的数据库会采取分库分表的方式.使用了分库分表之后需要解决的一个问题就是主键的生成.多个表之间的主键就不能用数据库本身的自增主键来支持,因为不同表之间生成 ...

  8. Nmap 在 WSL 中工作不正常

    Problem binding to interface , errno: 92 socket_bindtodevice: Protocol not available Problem binding ...

  9. 分库分表之后全局id咋生成?

    1.面试题 分库分表之后,id主键如何处理? 2.面试官心里分析 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局 ...

  10. 存储过程实例基于postgersql

    数据库用的是postgersql 数据库管理工具是DBeaver  mybatis操作数据库基于jdbcTemplate 1.写的存储方法放在数据库下面的Procedures目录下 function ...