算法笔记--区间dp

1.石子归并问题

dp[i][j]表示区间i到j合并所需的最小花费。

先求出小区间的最小花费,再转移到大的区间。

转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

初始状态:dp[i][i]=0

模板:

    for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i]
    for(int l=2;l<=n;l++){
        for(int i=1;i+l-1<=n;i++){
          int j=i+l-1;
          dp[i][j]=INF;
          for(int k=i;k<j;k++){
            dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
        }
    }

原文地址:https://www.cnblogs.com/widsom/p/8321670.html

时间: 2024-10-07 16:42:46

算法笔记--区间dp的相关文章

算法笔记--数位dp

算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 模板: int a[20]; ll dp[20][state];//不同题目状态不同 ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要判断前导零 { //递归边界,既然是按位枚举,最低位是0,那么pos==-1说明这个数我枚举完了 if(pos==-1) re

算法复习——区间dp

感觉对区间dp也不好说些什么直接照搬讲义了2333 例题: 1.引水入城(洛谷1514) 这道题先开始看不出来到底和区间dp有什么卵关系···· 首先肯定是bfs暴力判一判可以覆盖到哪些城市····无解直接输出···有解得话就要想想了···· 这道题关键是要发现··如果一个蓄水池所在城市可以覆盖到一些沙漠城市···那么这些沙漠城市肯定是一段····不然假设有一个城市是断开的而两边都被同一个蓄水池流出的水覆盖,这个城市四周的城市都肯定比它矮···(不理解举个反例吧···反正我举不出来)···然后就

石子合并问题 (朴素区间DP&amp;&amp;GarsiaWachs算法)

题目链接: http://poj.org/problem?id=1738 给定n堆石头,每次只能合并相邻的两堆的石头,每次的话费是这两堆石头的和: 方法一: 区间DP  复杂度为O(n^3) 状态转移方程 dp[i][j]=min(dp[i][k]+dp[k+1][j]+sup[i][j]) dp[i][j]表示合并从i堆石头到第j堆石头的最小花费,sum[i][j]表示从第i堆到第j堆石头的和 代码如下: <span style="font-size:14px;">#in

转载+删改:算法讲解之Dynamic Programing —— 区间DP [变形:环形DP]

发现一篇好文,可惜发现有一些地方有排版问题.于是改了一下,并加了一些自己的内容. 原文链接 对区间DP和其变式环形DP的总结. 首先先来例题. 石子归并 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n<=100) 第二行n个整数w1,w2...wn (wi

区间DP与贪心算法的联系(uav Cutting Sticks &amp;&amp; poj Fence Repair(堆的手工实现))

因为,这两题有着似乎一样的解法所以将其放在一起总结比较,以达到更好的区分二者的区别所在. 一.区间DP uva的Cutting Sticks是一道典型的模板题. 题目描述: 有一根长度为l的木棍,木棍上面有m个切割点,每一次切割都要付出当前木棍长度的代价,问怎样切割有最小代价. 区间DP的定义: 区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优值.

区间DP与贪心算法的联系(uav Cutting Sticks &amp;&amp; poj Fence Repair)

因为,这两题有着似乎一样的解法所以将其放在一起总结比较,以达到更好的区分二者的区别所在. 一.区间DP uva的Cutting Sticks是一道典型的模板题. 题目描述: 有一根长度为l的木棍,木棍上面有m个切割点,每一次切割都要付出当前木棍长度的代价,问怎样切割有最小代价. 区间DP的定义: 区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优值.

CSU 1616: Heaps(区间DP)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1616 1616: Heaps Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 9[Submit][Status][Web Board] Description Zuosige always has bad luck. Recently, he is in hospital because of pneumonia.

LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时候要枚举,这样时间复杂度是不可行的. 然后我就想降维度了,只能线性DP,dp[i]表示子串[0,i]的答案.这样可以从i-1转移到i,str[i]单独作一段或者str[i]能和前面的组成回文串,方程如下: dp[i]=min(dp[i-1]+1,dp[j-1]+1) (子串[j,i]是回文串) 现在

石子归并-2:区间DP{环形}

题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入描述 Input Description 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出描述 Output Description 输出共2行,第1行为最小得分,第2行为最大得分. 样例输入