奇妙的算法【7】-贪婪算法-dp】的更多相关文章

[算法模版]子序列DP 如何求本质不同子序列个数? 朴素DP 复杂度为\(O(nq)\).其中\(q\)为字符集大小. \(dp[i]\)代表以第\(i\)个数结尾的本质不同子序列个数.注意,这里对于每一个字符,只计算上一个相同字符带来的贡献.如果全部计算的话会算重复. 最后统计答案的时候也只统计每个字符最后一次出现的位置的答案. 例题:[线上训练13]子序列 中的50分部分分 #include<iostream> #include<cstdio> #include<cstr…
[算法模板]SOS DP 正文 SOS-DP(\(\text{Sum over Subsets}\))是用来解决这样的问题的: 其实就是子集和DP.上面每个\(F[mask]\)里面包含了\(mask\)所有二进制子集的信息.这是一种\(n\log_2 n\)的DP方法. 我们定义一个DP状态\(S(mask,i)\)代表\(mask\)子集中只有最靠右的\(i\)位与其不同的状态. 具体是这样的: 图中描述了\(S(10110,4)\)这个状态和其所有儿子之间的关系. 形象一些解释就是每次我们…
问题1描述:[贪婪算法,Dijistra算法] ①有一只兔子要从一个N*N的二维矩阵方格中从上跳到下面: ②每次只能向左或向下,越过一个方格,跳到下一个方格中: ③被越过的方格中的数值,表示该兔子越过该方格后需要休息的时间(或者能量); 求:到达最下面方格花费的最少时间是多少? 输入: 第一行,输入一个数值N 后面输入N行,每行有N个数值并且由[,]隔开 输出: 输出一个数据M,M为兔子需要花费的最小时间 示例: 输入: 6 1,2,3,5,7,6 2,1,4,5,7,4 3,4,5,6,3,6…
LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串与最长公共子序列 子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列:更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必.比如字符串acdfg同akdfc的最长公共子串为df,而他们的最…
There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges times[i] = (u, v, w), where u is the source node, v is the target node, and w is the time it takes for a signal to travel from source to target. Now, we…
算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ll dp[][state];//不同题目状态不同 ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要判断前导零 { //递归边界,既然是按位枚举,最低位是0,那么pos==-1说明这个数我枚举完了 )…
1.01背包 二维递推式子: 代码: ;i<=n;i++) ;x--) ][x-w[i]]+c[i],f[i-][x]); ][x]; printf("%d",f[n][m]); // f(n,m)为最优解 ; 然而有时候,由于容量或者物品数过多可能导致用二维数组可能超空间,此时可以考虑一维的优化 用f[i]表示当使用了i的容量后最多可以装多少价值的物品,我们可以推出以下代码: ;i<=n;i++) ;j--) if(w[i]<=j) f[j]=max(f[j],f[…
这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/262/summery/ 总体,比较系统.全面.在解决这些问题的时候,我都是先尝试使用自己的方法coding一遍,之后在看看其他比较巧妙的解决方法学习一下. 需要特殊技巧解决的难题:①切割回文:② 0,热身编程题 0.1只出现一次的数字[算法简单.但是想要达到优雅就需要动一动脑子] 给定一…
昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的有效号码 某个国家的电话号码规范为:①以8开头:②长度为11位 现在给出任意长度的一串数字,判断是否可以通过从头部或者尾部连续删除获得一串符合规范的电话号码? 下面的代码是我第一次就写好的.后期没有优化的,感觉也没什么可以优化的空间了[使用subString还可以在缩小搜索范围],这个题目一次通过…
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入导弹依次飞来的高度(雷达给出的高度数据是\le 50000≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统. 输入格式 11行,若干个整数(个数\le 100…
1. 对于序列x[1,i]和y[1,j],推导递推公式1.a 假设当前元素同样,那么就将当前最大同样数+12.b 假设当前元素不同.那么就把当前最大同样数"传递"下去 因此递推公式为: x[i] == y[j] : dp[i][j] = Max(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) + 1 x[i] != y[j] : dp[i][j] = Max(dp[i][j-1],dp[i-1][j]) 因为x[i]!=y[j]的情况不难能够对x[i]==y[j…
A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html /* 状态dp[i][j]有前j个数,组成i组的和的最大值.决策: 第j个数,是在第包含在第i组里面,还是自己独立成组. 方程 dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] )…
传送门 两种$DP$: ①$f_{i,j}$表示前$i$次选择,最大独立集为$j$时达到最大独立集的方案总数,转移:$a.f_{i,j}+=f_{i+1,j+2^k}$(保证$k$加入后符合条件):$b.f_{i,j}+=f_{i+1,j} \times \text{现在可以放的不影响最大独立集的点的数量}$,这个现在可以放的不影响最大独立集的点的数量就是不可选择的点(即已经选择和与已经选择的点相邻的点)的数量$-i$ 复杂度$O(2^nn^2)$而且似乎无法优化 #include<bits/s…
study from: https://www.cnblogs.com/flashhu/p/9480669.html 3.斜率dp study from:http://www.cnblogs.com/MashiroSky/p/6009685.html 或单减 https://www.luogu.org/problemnew/show/P3195 study from:http://www.cnblogs.com/MashiroSky/p/5968118.html 1 #include <cstd…
1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]) 初始状态:dp[i][i]=0 模板: ;i<=n;i++)cin>>a[i],sum[i]=sum[i-]+a[i] ;l<=n;l++){ ;i+l-<=n;i++){ ; dp[i][j]=INF; for(int k=i;k<j;k++){ dp[i][j…
插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一下这种思路清奇的dp是怎么回事 Part I 定义 何为插头? 插头实际上是一个代称,代指两个格之间的连通性 若dp的某一个状态中,有某相邻的两个格子是联通的(比如说处在同一条路径上.被同一个矩形覆盖blablabla),我们就认为这两个格子之间有插头 举个栗子,格子(1,1)和格子(2,1)联通,…
开头由于不知道讲啥依然搬讲义 对于引入的这个问题,讲义里已经很清楚了,我更喜欢用那个建树的理解···· 相当于先预处理f,然后从起点开始在树上走··记录目前已经找到了多少个满足题意的数k,如果枚举到第i位,下一位要走的是1,需要加上左子树的总数f[i-1][K-k],如果下一位走的是0直接走左子树即可···· #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #incl…
感觉对区间dp也不好说些什么直接照搬讲义了2333 例题: 1.引水入城(洛谷1514) 这道题先开始看不出来到底和区间dp有什么卵关系···· 首先肯定是bfs暴力判一判可以覆盖到哪些城市····无解直接输出···有解得话就要想想了···· 这道题关键是要发现··如果一个蓄水池所在城市可以覆盖到一些沙漠城市···那么这些沙漠城市肯定是一段连续区间····不然假设有一个城市是断开的而两边都被同一个蓄水池流出的水覆盖,这个城市四周的城市都肯定比它矮···(不理解举个反例吧···反正我举不出来)··…
树形dp的状态转移分为两种,一种为从子节点到父节点,一种为父节点到子节点,下面主要讨论子节点到父亲节点的情况: 例题1(战略游戏): 这是一道典型的由子节点状态转移到父节点的问题,而且兄弟节点之间没有相互影响,我们用f[i][0]/f[i][1]表示i不取/要取时其所在子树总共最少取的节点数,不难得出dp方程: 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath>…
题目 题目描述 杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有 4 或 62 的号码.例如:62315 73418 88914 都属于不吉利号码.但是,61152 虽然含有 6 和 2,但不是 62 连号,所以不属于不吉利数字之列. 你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际…
1,每个小孩的糖果数量是多少 有p个小孩,c个糖果,刚开始第1个小孩发一个糖果,第2个小孩发两个糖果,第p个小孩发p个糖果,如果糖果没有发完,就接着[注意]第1个小孩发p+1个糖果.....第p个小孩发2*p个糖果,如果糖果还没有发完,就继续下一轮,第1个小孩发2*p+1个糖果,... 方法一,遍历[这种方法太low了就折叠一下] package com.cnblogs.mufasa.Main1; import java.util.Scanner; public class Main { pub…
链接:https://ac.nowcoder.com/acm/contest/3002/I来源:牛客网https://ac.nowcoder.com/acm/contest/3002/I 题目描述 "にっこにっこにー"     ——nico nico平时最喜欢说的口头禅是niconiconi~. 有一天nico在逛著名弹幕网站"niconico"的时候惊异的发现,n站上居然有很多她的鬼畜视频.其中有一个名为<让nico为你洗脑>的视频吸引了她的注意. 她…
时隔多日,我终于再次开始写博客了!! 上午听了数位 dp,感觉没听懂,于是在网上进行一番愉 ♂ 快 ♀ 的学习后,写篇博来加深一下印象~~ 前置的没用的知识 数位 不同计数单位,按照一定顺序排列,它们所占位置叫做数位. 在整数中的数位是从右往左,逐渐变大:第一位是个位,第二位是十位,第三位是百位,第四位是千位,第五位是万位,第六位是十万位,第七位是百万位,第八位是千万位,以此类推. 同一个数字,由于所在数位不同,计数单位不同,所表示数值也就不同. 对于每一个数都应当有一个名称,以自然数来说,自然…
参考资料 背包九讲 一.线性DP 如果现在在状态 i 下,它上一步可能的状态是什么. 上一步不同的状态依赖于什么. 根据上面的分析,分析出状态和转移方程.注意:dp 不一定只有两维或者一维,一开始设计状态时先不考虑维度.如果空间超了的话考虑滚动数组等优化,或者再重新设计状态. 可以通过哪一个条件范围小来入手设计状态. 对于边界条件:一般是考虑第一个点的特殊情况,即 \(dp_{[1]}\). 二.背包问题 1. 01背包 模型总结:每个物品只能选一次. 思想 每件物品可以通过放或者不放来转移,所…
内容中包含 base64string 图片造成字符过多,拒绝显示…
study from: https://www.cnblogs.com/flashhu/p/9480669.html 1.前缀和 https://www.luogu.org/problemnew/show/P2513 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <time.h> #include <string> #…
1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.角色变换!!! package com.cnblogs.mufasa; public class Answer1_Hanoi { public sta…
1,判断一个十进制正整数的二进制数是否为回文 package com.cnblogs.mufasa.answer1; import java.util.Scanner; public class Main { public static void main(String[] args) { //0,测试专用数据 // int[] nums={1,4,7}; //1,数据输入 Scanner sc=new Scanner(System.in); int T=sc.nextInt(); int[]…
表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直到一年前帮同学做了个手机游戏demo才发现了一个严峻的问题 为啥*一样的画面能跑出ppt的质感? 虽然发现当时的问题主要出现在使用了一个有bug的API,它导致了低性能的循环调用,但是从那时便开始就重新审视算法了,仅仅一个函数就能大幅地改变程序带给用户的体验这个观念根植心底 后来多多少少也学习了一些算法的知识…
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法,当然这个问题用线段树同样能够解决. 问题:给出n个数ai,让你快速查询某个区间的的最值. 算法分类:DP+位运算 算法分析:这个算法就是基于DP和位运算符,我们用dp[i ][j]表示从第 i 位开始,到第 i + 2^j -1 位的最大值或者最小值. 那么…