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

因为,这两题有着似乎一样的解法所以将其放在一起总结比较,以达到更好的区分二者的区别所在。

一、区间DP

uva的Cutting Sticks是一道典型的模板题。

题目描述:

有一根长度为l的木棍,木棍上面有m个切割点,每一次切割都要付出当前木棍长度的代价,问怎样切割有最小代价。

区间DP的定义:

区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优值。

解法:

设F[i,j](1<=i<=j<=n)表示区间[i,j]内的数字相加的最小代价 , 最小区间F[i,i]=0(一个数字无法合并,∴代价为0)每次用变量k(i<=k<=j-1)将区间分为[i,k]和[k+1,j]两段

区间DP模板,代码:

for(intp = 1 ; p <= n ; p++){      //p是区间的长度,作为阶段
  for(int i = 1 ; i <= n ; i++){   //i是穷举区间的起点
      int j = i+p-1;               //j为区间的终点
      for(int k = i ; k < j ; k++)//状态转移
         dp[i][j] = min{dp[i][k]+dp[k+1][j]+w[i][j]};//这个是看题目意思,有的是要从k开始不是k+1
         dp[i][j]= max{dp[i][k]+dp[k+1][j]+w[i][j]};
      }
}

改题解法:

对于这一题,如果我们只对最左边的切割点到最右边的切割点进行DP,那么得到的答案肯定是错的,因为不是整个区间,所以我们必须在木棍的做左边和左右边分别增加一个点,那么得到的就是整个区间,再对这个区间进行DP求解即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 50 + 10;
const int INF = ~0U >> 2;
int w[MAXN],dp[MAXN][MAXN];
int L,n;

int solve(){
    n++;
    for(int i = 0;i <= n;++i)
        for(int j = i+1;j <= n;++j)
            dp[i][j] = (i+1 == j ? 0 : INF);

    w[0] = 0; w[n] = L;
    for(int p = 1;p <= n;++p){            //区间长度
        for(int s = 0;s <= n-p;++s){       // 起始位置
            int e = s + p;                //终点
            for(int k = s+1;k < e;++k){    //状态转移
                dp[s][e] = min(dp[s][e],dp[s][k] + dp[k][e] + w[e] - w[s]);
            }
        }
    }
    return dp[0][n];
}
int main()
{
    while(scanf("%d",&L),L){
        scanf("%d",&n);
        for(int i = 1; i <= n; ++i){
            scanf("%d",&w[i]);
        }
        printf("The minimum cutting is %d.\n",solve());
    }
    return 0;
}



时间: 2024-11-03 00:29:39

区间DP与贪心算法的联系(uav Cutting Sticks && poj Fence Repair)的相关文章

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

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

nyoj891(区间上的贪心)

题目意思: 给一些闭区间,求最少须要多少点,使得每一个区间至少一个点. http://acm.nyist.net/JudgeOnline/problem.php?pid=891 例子输入 4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2 例子输出 1 3 1 题目分体: 区间贪心.我觉得区间上的贪心算法,最基本的还是排序的方式.仅仅要排序的方式合理.就能非常好的使用贪心,贪心的本质尽管是选择当前最优的解,作为全军最优解的一部分.假设排序不当回造成好的条件选择.本题仅仅给

贪心算法小结

贪心算法,更确切的说是一种解决题目的思想,简单来说是对于问题的特殊解,它可以通过某种特殊的规则,不断地选取最优的策略. 比如说,最简单的贪心问题: 使用最少的硬币数量来解决付账的问题(恰好完成数额, 不需要找零) 区间的调度问题(给你多个区间, 可能会有交叉现象, 你需要找所给你的实现当中找出不交叉的区间数量最大值) 头排序,但是你发现不能找到最优的解. 尾排序,判断先可以结束的是不是头位置不与之前的区间尾部位置有交叉即可以 FENCE REPAIR 最小生成树,霍夫曼树, 灯塔问题(一个点管理

算法专题——贪心算法

贪心算法正确性证明: 1.证明贪心选择性质:经过贪心选择,可以获得最优解 2.最优子结构:证明子问题最优解与贪心选择组合,结果依然是最优解 •All we really need to do is argue that an optimal solution to the subproblem, combined with the greedy choice already made, yields an optimal solution to the original problem. 例:

石子合并问题 (朴素区间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

贪心算法-区间调度问题解之证明

一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3,......,N},第i个需求与一个开始时间s(i),结束时间f(i)相对应.如果没有两个需求在时间上重叠,我们就说需求的子集是相容的. 2. 目标:寻找一个最大的相容子集O. 3. 算法: 初始令R是所有需求的集合,设A为空 While ( |R| > 0 ) 选择一个最早结束的需求 把i加入到

转载+删改:算法讲解之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

贪心算法----区间调度问题

题目: 有n项工作,每项工作分别在si时间开始,在ti时间结束.对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?  1≤n≤100000  1≤si≤ti≤109.这道题目还可以称作不相交区间问题. 输入: 第一行:n 第二行:n个整数空格隔开,代表n个工作的开始时间 第三行:n个整数空格隔开,代表n个工作的结束时间 样例输入

算法复习——区间dp

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