自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 P2279 [HNOI2003]消防局的设立

本来看着像是树状DP,但是状态好麻烦。所以可以用贪心。如果一个节点没有消防局覆盖,那么在祖父节点处建立消防局最优这个思想一开始想到了,奈何代码能力不够。所以借鉴了一下洛谷上的思路。1.用d[i]储存深度,b[i]来代表节点值。然后这个cmp函数来排列b[i],即实现了b[i]代表第i深的节点值2.用o[i]来储存到这个节点最近的消防局距离。f[i]代表父节点(由于输入a[i]小于i,所以1...

2019-04-12 23:48:39 224

原创 P1373 小a和uim之大逃离

关键是状态的选择。我一开始使用了dp[i][j][k]表示路径终点为(i,j)格差为k时的种数但是后来发现这样的状态转移方程emmmm转移过程中会出错,而且会TLE。所以还是按洛谷上的题解#include<bits/stdc++.h>using namespace std;int a[805][805];int dp[805][805][17][2]={0};const ...

2019-04-10 23:40:24 144

原创 P1736 创意吃鱼法

思路很明确,但是也有两个坑1.对角线包括左对角线和右对角线2.每个状态由三个值来取最小值,如图。一开始没有考虑绿色,导致类似这样的数据4 41 0 0 10 1 0 00 0 1 01 0 0 1最后dp[4][4]的值为1,而正确答案是为3。也就是说,它可以继承上一个状态的一部分#include<bits/stdc++.h>using namespace s...

2019-04-08 09:30:50 148

原创 P1417 烹调方案

乍一看是01背包问题,实际上不是01背包问题的写法,是整个物品数组从前往后更新。当你更新第i个物品的时候,此时的状态空间是前i-1个物品的最优解。也就是说已经隐含了先更新,先选择由于01背包问题的物品价值与其先后顺序没有关联,所以不用排序。但在这个题里面,如果物品的先后选择直接影响了结果。借用洛谷上的题解现在考虑相邻的两个物品x,y。假设现在已经耗费p的时间,那么分别列出先做x,y的代价:...

2019-04-07 19:35:14 130

原创 P1006 传纸条

三维dp主要是要找到描述状态的数组。这里可以将传纸条来回的过程看作同时从左上传两张纸条给右下,且路径不重复。由于路径长度相等,所以说每一个时刻两个纸条的i+j是恒等的。所以就可以用dp[sum][j][k]来描述每一个时刻两个纸条所在的位置。而这一时刻的两个纸条的状态由上一时刻的1~4个状态转移而来。所以就有了状态转移方程 if(i-j>1){ ...

2019-04-07 12:50:51 300

原创 P1140 相似基因

1.因为第一/二段的1与第二/一段的0匹配时可视作与空碱基匹配,所以先进行一波预处理2.状态转移方程3.转化为数字和COST矩阵简化代码。#include<bits/stdc++.h>using namespace std;int dui[6][6]={ {0,0,0,0,0,0}, {0,5,-1,-2,-1,-3}, {0,...

2019-04-02 21:49:39 117

原创 P1280 尼克的任务

这个题虽然知道是dp,但是刚刚开始,思路尚不明确。1.首先,这个题应该是从后往前推。因为如果你选择了一项任务,你现在的状态是从未来的时刻转移回来的。换句话说,你不能在这个时刻选择这个时刻已经结束的工作。因此,应该从后往前推。2.如果从后往前推,那么就需要已知初始时刻在dp[n]的值。所以,让dp[i]代表从i~n中间的空余时间。dp[n]=03.其余的,例如线段覆盖的排序问题用结构体写并排序...

2019-04-01 22:25:52 120

原创 P3368 【模板】树状数组 2

树状数组可以有两类操作1.区间查询和点修改2.区间修改和点查询这两种操作的本质差别就是,tree数组的意义不同。在1中,tree数组是储存的区间和,2中,tree数组储存的是一个差分数组。这道题是用的2如果tree数组是一个差分数组,那么Σtree i = a[i],且区间修改只需要update(x,k)和update(y+1,-k)。注意,tree[1]=a[1],作为初项,才能满足上...

2019-03-28 23:43:20 126

原创 P3374 【模板】树状数组 1

树状数组也是一种分块数组,终极理解在这张图上(网上偷的)可以看到,每2^i个a[i]就有一个管理这一块矩阵值的c[i]。而且有x+lowbit(x)为x对应父节点的下标x-lowbit(x)为x所管辖块的前一块的父节点的下标tree[i]储存值,而且取了前缀和summ(x)后,还可以很轻松地完成区间和的查询但是树状数组的限制就在:只能求前缀问题和差分问题。所以更广的应用还是在线段树上...

2019-03-28 22:01:14 144

原创 P3372 【模板】线段树 1

线段树学习这个题来看,线段树分为建树,更新,查询。1.建树void build(ll p,ll l,ll r){ tag[p]=0; if(l==r){ dat[p]=a[l]; return; } ll mid=(l+r)>>1; build(lson(p),l,mid); build(rson(p...

2019-03-27 13:14:26 117

原创 P1064 金明的预算方案

将附件用一个数组储存到主件后面,然后对主件进行判断1.该主件没有附件则有2个状态:不选该主件,选该主件2.该主件有一个附件,则有3个状态:不选,选主件,选主件+附件3.该主件有两个主件,则有5个状态:不选,选主件,选主件+附件1,选主件+附件2,选主件+附件1+附件2.注意:1.储存的时候从i=1开始,不然容易出错2.对于每个状态,应该分别判断此时背包能不能装下。#include&l...

2019-03-26 19:21:32 102

原创 1141E - Superhero Battle

总体思路明确,但是犯了2个非常低级的错误。。。1.判断错误条件一开始写的(mn>=0||d[n-1]>=0) 实际条件是mn>=0||(d[n-1]>=0&&H+mn>02.d[i]不是原来的伤害,而是从iter*n+0时刻开始到这个时候的一个总伤害值,在最后一次循环的伤害计算时犯错#include<bits/stdc++.h>u...

2019-03-21 16:14:31 321

原创 1141D - Colored Boots

先同色匹配,再?匹配剩下的,再?匹配?我的错误1.我的理解是先?匹配其他色,再?匹配?,再同色匹配同色。。。。不知道哪里出错2.对queue.empty()理解出错。。。。当空返回1。好久 没有打代码了,犯下低级错误。#include<bits/stdc++.h>using namespace std;queue<int> leftshoe[27];queue...

2019-03-21 13:05:27 126

原创 1141C - Polycarp Restores Permutation

这个题好坑。。。如果给你一个很大的数(42样例中为10738),再加上199992个数,就会让mx达到21亿,让int溢出,RE的结果。所以在循环的过程中,就要判断最大值是否比最小值大N,如果已经大N了,则没有解,直接退出。本题不成立的两个条件1.最大值比最小值大N及N以上2.有两个重复数字#include<bits/stdc++.h>using namespace std;...

2019-03-21 12:58:03 363

原创 UVA-10003 Cutting Sticks(dp)

可以用记忆化搜索,也可以用递推。1.记忆化搜索,从[0,l]的状态推到基础状态,用时间很多(660ms)2.递推,从基础状态,长度慢慢增加,最后推到[0,l] 状态,相对节约时间(500ms)#include&lt;bits/stdc++.h&gt;#define INF 1&lt;&lt;30#define mxn 1005using namespace std;int d[mxn...

2019-02-07 19:09:16 109

原创 UVA-11584 Partitioning by Palindromes (dp)

状态:d[i]表示前i个字符所组成的最少回文串。状态转移:d[i]=min(d[j]|s[j+1:i]是回文串)#include&lt;bits/stdc++.h&gt;#define INF 1&lt;&lt;30using namespace std;char s[1005];int d[1005];bool check(int l,int r){ while(l&lt;r...

2019-02-07 16:31:51 128

原创 UVA-11400

用了构造函数再用结构体数组就会报错!。。。#include&lt;iostream&gt;#include&lt;algorithm&gt;using namespace std;const int maxn = 1000 + 5;struct Lamp { int v, k, c, l; bool operator &lt; (const Lamp&amp; rhs) co...

2019-02-07 14:00:55 184

原创 UVA-12563 Jin Ge Jin Qu hao(DP;01背包:两个条件最优化)

稍微转换一下就是01背包问题。值得注意的是,这里要先保证唱的歌数最多,其次是唱的时间越长。我在这里用了分情况讨论:1.不唱这首歌,总歌数多一点,则不唱这首歌 if(dp[t][0]&gt;dp[t-ge][0]+1){ continue; }2.唱这首歌,不唱这首...

2019-02-06 23:27:29 138

原创 HDOJ-2602 Bone Collector (01背包问题)

主要是要找到状态转移方程。第一种办法,开dp[N][V],表示前N个物品,占体积V的最优价值。在这种方法的情况下,dp[i][j]由两个状态的最优值转移过来,分别是拿了没拿第i个(dp[i-1][j]),和拿了第i个(dp[i-1][j-ti[i]]+jia[i])这两种状态。代码为#include&lt;iostream&gt;#include&lt;cstdio&gt;#inclu...

2019-02-06 21:05:31 162

原创 UVA-437 The Tower of Babylon (DAG上的DP)

用一个3*n的数组保存N个立方体的3个状态,然后建图,注意建图的时候是底的短边与上的短边比,底的长边与上的长边比。然后开始dp,总的来说,dp的步骤1.记忆化搜索,看d[i]是否被计算过,如果被计算过,直接返回这个值。(用vis[i]来办)2.d[i]没有被计算过,则先置vis[i]=1,然后通过邻接矩阵来更新这个值。#include&lt;bits/stdc++.h&gt;using ...

2019-02-05 22:18:15 118

原创 UVA-1025 A Spy In the Metro (dp)

这个题好像是“填表法”每个状态都是由:左边火车开来,右边火车开来,等候,这三种状态转移而来,所以只需要比较这三个状态转移而来的最小值。需要注意的是状态转移的方向,以及判断不越界条件的顺序(下标一般在前面)。#include&lt;bits/stdc++.h&gt;#define INF 0x6FFFFFFF#define mxn 500using namespace std;int d...

2019-02-05 18:49:55 123

原创 UVA-11491(贪心)

这个题一开始从“需要多少个数字”来考虑了,想从数字本身的大小来考虑。但是数字位数也是很重要的一个标准,所以这样必WA。正确的方法,还是要从左边扫到右边。比较答案的最后一个与输入的下一个,如果输入的下一个比较大,那么将原答案的划掉。如果输入的下一个比较小,那么输入下一个。如果最后答案长度长于需要长度,说明d&gt;0,继续将末尾的划掉即可。#include&lt;bits/stdc++.h&gt...

2019-02-04 00:00:28 289

原创 UVA-12545

这个题先考虑‘0‘优先还是’1‘优先,因为这里0可以变成1,但是1不可以变成0,所以应该是0优先,即S串上的?如果对应T串上的0,则优先变成0.第二步,再考虑外面的01交换。如果交换过后,S串?区外对应需求0比较多,那么还没变成1的?就要先变成0,再交换,直到?区外面的S串与T串一样。如果?区外对应需求1比较多,那么只需要外面的0自己变成1,?区内变成对应的数字就行了。#include&lt;...

2019-02-02 23:53:03 95

原创 UVA-1610

这个题感觉好绕,最后绕出来了,发现uDebug里面的也有错??直接暴力求解法就出来了,不用比较啥的。如果用注释掉的“比较法”代码,估计错就错在是’A’到’Z’的序列,如果超过Z还要长度加一的。#include&lt;bits/stdc++.h&gt;using namespace std;int main(void){ int n; while(scanf("%d",&...

2019-01-29 21:33:15 142

原创 UVA-1149

先sort,再左右两端指针判断,注意退出条件为l&gt;r。如果l==r,还要加一个。#include&lt;bits/stdc++.h&gt;using namespace std;int main(void){ int t; cin&gt;&gt;t; while(t--){ int n,len; cin&gt;&gt;n&gt;...

2019-01-29 20:15:52 91

原创 UVA-1442

要想到连同器原理:此地图上某一点的最大高度,为min(左边最大高度,右边最大高度,这一点的天花板),然后根据这个原理,分别以左边最大高度和右边最大高度扫描两次,最后取一次min#include&lt;bits/stdc++.h&gt;using namespace std;int main(void){ int t; cin&gt;&gt;t; while(t--)...

2019-01-28 17:40:26 177

原创 UVA-1609

这个题就是纯构造,一旦找到“黑队”和“白队”的概念,就有一定的思路了。后面就是构造四个阶段。每一个阶段的原则就是尽量让白队打黑队,然后让黑队内部打,最后随机分配。#include&lt;bits/stdc++.h&gt;using namespace std;const int maxn = 1024+5;char table[maxn][maxn];int main(void){...

2019-01-28 17:18:35 193

原创 UVA-1608

用一个prevv数组和nextt数组分别表示i位置上一个相同元素的位置和下一个相同元素的位置。然后先找到只出现一次的元素,标记其位置为p,则继续判断[0,p-1]与[p+1,n-1]…是一个递归。其中,有两处时间必须优化。第一,这里的元素最大可能为10e9,则用一个last数组来表示某个值上一次出现的位置会对空间有很大的要求。所以这里用一个MAP,节约了空间,时间只从O(1)便成了O(logn...

2019-01-28 16:34:37 271

原创 UVA-11093

从一号加油站开始,如果最多只能开到P号加油站,那么1,2,3…p号都不能作为起点。那么,从P+1号继续模拟。实现的时候,有两个细节需要注意。1.循环的时候 pos++; if(pos==n){ pos=0; }这两句必须在一起,不然会越界。2.pos是从temp开始,走到能走到的最后一个。如果pos&lt;temp...

2019-01-27 15:41:07 132

原创 UVA-12627

一个简单的递归,注意边界条件以及开 LONG LONG !!!#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;typedef long long ll;ll func(ll k, ll i){ if(i==0) return 0; if(k==0) return 1; ll sum= (int)pow(...

2019-01-26 20:42:37 113

原创 UVA-10954

huffman编码的构建。用到了小顶堆的优先队列。(priority_queue(int , vector&amp;lt;int ,greater&amp;lt;int)#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;int main(void){ int n; while(scanf(&quot;%d&quot;,&amp;amp;n)&amp;amp;

2019-01-19 22:32:18 121

原创 UVA-714

这个题巧妙运用了二分然后逼近。首先确定min(S)的范围,然后再用二分逼近,最后的结果就是必然存在的那个最小值。另外,输出使用了贪心。而且这里的板是“后置板”,即先输出数,在输出板。位置i最多可以分成i+1块,而此刻的需求k是至少让剩余部分分成k-1块(因为如果在这里加一块的话,后面的部分会加一块)。如果i+1==k-1,即i+1&lt;k的时候,就需要让后面的部分每一个单独的元素变成一块了。...

2019-01-19 22:14:34 229

原创 UVA-1471

这个题有点难以理解。。。。不是很懂,似懂非懂我只能写到init部分。#include&lt;bits/stdc++.h&gt;using namespace std;const int mxn=200000+5;int a[mxn],f[mxn],g[mxn],n;struct node{ int a,g; node (int a,int g):a(a),g(g){...

2019-01-19 18:12:27 138

原创 UVA-11572

第一种用set,比较简单易懂。第二种的map,相当于就是用map临时储存某个元素的上一个元素的位置,然后构造了一个last数组。根据last数组,只要last[i]&lt;l,即在一个子序列中,右边的元素的上一个位置在L之外,就可以向右拓展。#include&lt;bits/stdc++.h&gt;using namespace std;//solution 1int main(voi...

2019-01-19 16:41:24 156

原创 UVA-1152

把a+b与c+d的结果储存到两个数组里面,再排序,“快排”一样从头到尾和从尾到头遍历。注意输出不要PE;#include&lt;bits/stdc++.h&gt;using namespace std;//-1 -1 1 1int main(void){ int n; cin&gt;&gt;n; while(n--){ int l; ...

2019-01-18 21:48:56 250

原创 Leetcode 315 计算右侧小于当前元素的个数

期末终于结束了额。第一次写分治。这个题是用结构体储存分治过程中,此元素右边较小元素的个数。第一次WA:分支过程中,在元素p右边比元素p更小的元素个数为q-m。但是在过程中有很多这样的元素,所以应该+=,而不应该=。第二次WA:判断q的位置的时候,是a[p]&lt;=a[q]就将q-m加到p.v上。因为这个题是要求小于,所以大于等于就是它的互斥条件。除此之外,分治还有很多细节需要熟悉。c...

2019-01-18 11:44:09 375

原创 C++ 快排以及第k+1小的元素

还要加深对快排的理解吖。#include&amp;amp;lt;cstdio&amp;amp;gt;using namespace std;void qc(int *a,int left,int right){ if(left&amp;amp;gt;=right) return; int fir=left,las=right,key=a[left]; while(fir&amp;amp;lt;las){ whil...

2019-01-06 00:10:41 168

原创 刘汝佳第七章UVA-10603

1.这个题要求的是输出最小水量。BFS的队列实现就是用一个量来衡量两个状态的先后顺序,然后根据这个先后顺序来决定先遍历哪个状态。在这里,需要定义一个dist来代表到这个状态的最小水量,然后重载运算符,最小水量越少,这个状态优先级越高。如果定义步数,则会找到最小步数,这个是BFS的特点决定的。即,BFS能找到目标状态的某一个最小量。如果状态用结构体表示的话,这个最小量可以用一个函数重载来定义。2...

2019-01-05 00:25:27 172

原创 刘汝佳第七章UVA-129

这里两个暴力法的点第一,递归暴力,默认之前的状态都是符合要求的,只需要讨论目前的状态(八皇后)第二,用return true 来达到“搜到就输出”的效果PE懒得改了#include&lt;cstdio&gt;using namespace std;int n,l;int ans[1000]={0};int ct=0;bool dfs(int cur){//cur没填,ct为之前...

2019-01-02 13:54:52 128

原创 UVA-524

DFS水题,注意回溯,以及最后一位的判断有两个方向#include&amp;lt;cstdio&amp;gt;#include&amp;lt;cstring&amp;gt;using namespace std;int ans[20]={0};bool prime[40]={false},use[18]={false};void dfs(int pos,int n){//pos没填 if(pos==n){...

2019-01-01 17:56:41 123

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除