![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 65
deepquiet
这个作者很懒,什么都没留下…
展开
-
Prince and Princess(动态规划)
题目大意:求两个序列的最长子序列代码:#include#include#include#includeusing namespace std;int n, p, q;const int maxn = 250*250;int num1[maxn];int hash[maxn], stack[maxn];int main() { int kase; scanf("%d原创 2016-01-28 00:13:15 · 696 阅读 · 0 评论 -
Tour uvalive3305
题意:给出n个点,要求飞行员严格从1点出发至最右点(只能往右),再严格往左回到1思路:由于是闭合的,所以n与n-1一定是相连的,那么一定有总路劲是dp[n][n-1]+a[n][n-1],dp[n][n-1]表示从n走到1在从1走到n-1,从而构成环i与i-1有可能是一侧也有可能是两侧,在枚举i-1之前的点j:如果一侧,那么有dp[i][j]=dp[i-1][j]+a[i][i原创 2016-04-10 15:52:55 · 233 阅读 · 0 评论 -
uva104
题意:题目意思就是找到一个环路,使得起点在绕过一圈后升值思路:dp,f[t][i][j]表示的是第t次从i到j得到的最大汇率代码:#include#include#include#include#includeusing namespace std;const int maxn =25;const int inf = 0x3f3f3f3f;double mmap原创 2016-07-22 15:38:56 · 312 阅读 · 0 评论 -
uva10003+uva765+uva111
三种基础dpuva10003:记忆化搜索递推公式:dp[u][v] = min(dp[u][k]+dp[k][v]+a[v]-a[u], dp[u][v])意思就是在某两个断点之间(0和m+1也算)选择断那个断点或不断,那么耗费自然是当前的全长代码:#include#include#include#includeusing namespace std;const原创 2016-08-03 18:07:47 · 283 阅读 · 0 评论 -
uva116
题意:选择一条道路,使得在总数最小的同时,保证行数最小(字典序最小)思路:记忆化搜索,那么反向的话是一定要往右的,往右的同时可以选择不动,往上,往下(之所以一定要往右是应为到达最右是结束条件,如果不往右,而整个是柱形的,一直上下的话挑不出循环)这也是道路输出的依据代码:#include#include#include#includeusing namespace s原创 2016-08-04 19:32:56 · 290 阅读 · 0 评论 -
uva10131
题意:找到一个最长串,使得大象的体重递增,智商递减思路:记忆化搜索,控制好条件就行这里一个输出路径的技巧:先全部置为本身,那么最后一个点显然是没有下一个点的,所以当路径的值为本身是就结束了代码:#include#include#include#includeusing namespace std;const int maxn = 1005;struct no原创 2016-08-04 20:32:42 · 345 阅读 · 0 评论 -
uva11324
题意:给出一张图,求最庞大的点之间至少单向可达的集合的点的数量思路:想求出全部的SCC,然后在把所有的SCC当成一个点,将所有不再一个SCC里但有关联的点连起来构成DAG,dp求最大值代码:#include#include#include#include#include#includeusing namespace std;const int maxn = 100原创 2016-08-04 22:18:46 · 275 阅读 · 0 评论 -
uva10069
题意:b在a中可不连续出现但按顺序出现的次数思路:dp[i][j][k]表示前j个b在前i个a中出现的次数,最后一位是用于大数统计那么一遇到相同的,就有递推公式dp[i][j] = dp[i][j-1]+dp[i-1][j-1](汇集j-1)代码:#include#include#includeusing namespace std;const int maxn原创 2016-08-20 19:45:38 · 358 阅读 · 0 评论 -
uva103
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子。记忆化搜索#include#include#include#includeusing namespace std;const int maxn = 35;int n, m;struct box { int w[12]; int size; vo原创 2017-03-20 21:31:55 · 279 阅读 · 0 评论 -
uva10003
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费。可以发现,动态规划的思想是往后一直计算,然后当前阶段循环比较出最优值#include#include#include#include#includeusing namespace std;const int maxn=55;int s[maxn], d[maxn][maxn], len, n原创 2017-03-20 22:11:09 · 298 阅读 · 0 评论 -
uva10192
你想要去旅游,爸爸妈妈给了你意见,你为了不让他们伤心,你要尽可能的满足他们给的意见。#include#include#includeusing namespace std;int n1, n2;int a[105], b[105];int f[105][105];int main() { int i, j, kase=0; while(scanf("%d %d", &n1,原创 2017-03-20 22:13:32 · 287 阅读 · 0 评论 -
uva10066
有两座塔,由不同的石头组成,现在要去掉一些石头让两个塔一样,求塔最后剩下的最大高度。#include#include#includeusing namespace std;int n1, n2;int a[105], b[105];int f[105][105];int main() { int i, j, kase=0; while(scanf("%d %d", &原创 2017-03-20 22:15:06 · 258 阅读 · 0 评论 -
动态规划整理
动态规划整理原创 2017-03-22 17:12:29 · 337 阅读 · 0 评论 -
uva562
uva562,把硬币分成两堆,两堆的差值尽量小思路:就是把总值/2,然后尽量靠近这个值,每个硬币只能用一次,所以是0-1背包#include#include#include#includeusing namespace std;const int maxn = 105;int coin[maxn];int d[maxn][maxn*500];int main() { i原创 2017-03-22 13:32:02 · 471 阅读 · 0 评论 -
uva357
类似于uva674#include#include#includeusing namespace std;long long count[32002];int table[5] = {1, 5, 10, 25, 50};long long dp(int n) { count[0] = 1; int i, j; for(i=0; i<5; i++) for(j=table[原创 2017-03-22 13:32:41 · 370 阅读 · 0 评论 -
uva624(0-1背包)
题目:给不一组数,以及一个目标值,选出相加后最接近这个值得数,每个数用1次#include#include#include#include#includeusing namespace std;int n,tn;const int maxn = 10005;int t[25];int dp[maxn];int path[25][maxn];int main() {原创 2017-03-22 13:33:30 · 152 阅读 · 0 评论 -
uva10130
题意:在重量一定的前提下怎么使购买的商品的价格尽量高,每个商品只能买一个#include#include#include#include#includeusing namespace std;int n,tn;const int maxn = 10005;int t[25];int dp[maxn];int path[25][maxn];int main() {原创 2017-03-22 13:35:19 · 202 阅读 · 0 评论 -
uva531
题意:找出两段话连续最长的单词组主要学习如何输出,就是把I,J用计算方法记录下来,然后的话所有被跳过的单词都是这个值,也就是说,这个算出来的IJ减一的话是上一个找到的单词的位置#include#include#include#include#includeusing namespace std;char w1[105][32];char w2[105][32];int dp原创 2017-03-22 14:26:11 · 225 阅读 · 0 评论 -
Bigger is Better
题意:用n根火柴棒搭出数字,求这个数能被m整除的最大值思路:递推的式子是newi=i+num[k][根数], newj=(j*10+k)%m[余数]dp[newi][newj] = max(dp[i][j]+1, dp[newi][newj]);那么ans是只针对余数为0的情况出发点是dp[0][0],结尾点是dp[i][0],之间必定是会得出一条等差数列(d=1)铺成原创 2016-04-07 21:34:19 · 390 阅读 · 0 评论 -
UVALive - 4614 Moving to Nuremberg (树形DP)
题意:找出一个点,使得从这个点出发经过规定点规定次数路径总和最短思路:首先先建树,设1为根,并计算从1出发的总路径那么从父结点递推下去算其字节点有:dp[v] = dp[u]+(sum-f[v])*len*2-f[v]*len*2 式子的意思就是v以上的点(-f[v])要多走u->v, 然后呢由于dp[u]里面含有v以下的点v->u的路径,所以减去代码:#include原创 2016-04-06 18:35:36 · 192 阅读 · 0 评论 -
Game of Sum(动态规划)
题目:给出一串数组,两人博弈,统计两人拿到的总数,求先手赢对手的最大值.这道题小白上也有,做的时候觉得有做过类似的跑回去找找看,后来发现是一样的.不过第一次做的时候没理解透,觉得样例输出不是最优解,今天才真的明白.#include #include #include #include #include using namespace std;const int MAXN原创 2016-01-28 00:34:06 · 314 阅读 · 0 评论 -
Placing Lampposts
题意:在一个无向无环图上放置灯盏,保证灯的数量最少的同时被两盏灯照亮的边数尽量大.思路:把被两盏灯照亮的边数尽量大转化成被一盏灯照到的边尽量少,如果有两个需要优化的量v1,v2,要求首先满足v1最少,在v1最少的前提下v2最少,则设一个M,M > max(v2)-min(v2).然后设一个x,使x=Mv1+v2.#include#include#include#inclu原创 2016-01-29 20:07:40 · 366 阅读 · 0 评论 -
Robotruck
题意:求机器人将垃圾扔到垃圾桶的最短距离.思路:主要是基于一个等式:dp[i] = dp[j] + dis[j + 1] +dist[i] - dist[j + 1] + dis[i] ;dp[i]表示扔垃圾的往返时间.那么就是要求:min(dp[j] + dis[j + 1] -dist[j + 1]) +dist[i] + dis[i], 就引出dp[j]+dis[j+1]原创 2016-01-30 00:10:17 · 691 阅读 · 0 评论 -
uva11795 Mega Man's Mission
题意:(终于能打中文了= =)先给几把武器来消灭机器人(字符串为1是表示这个编号的机器人可消灭), 然后再给出先灭当前的机器人之后获得的武器(即消灭其他机器人的能力),求消灭所有机器人的方案思路:用二进制来表示消灭的机器人以及有的可消灭某编号的机器人的武器首先枚举消灭机器人的所有情况,作为下标,然后数组存储的是这种情况下拥有的武器(这里产生了很大的困惑,应为消灭机器人明显是有先原创 2016-03-16 17:06:33 · 619 阅读 · 0 评论 -
String painter
题意:将第一个串转变为第二个串所需的最少步数思路:由于可以取任意的段变成相同的字符,所以当遇到原串与目标不同时取目标的上一个与当前相同的字符将整个区间变为当前字符,操作加一,然后将中间这一场串进行处理的到最小操作数(相同处理方式,切割成相同位置前与相同位置与结尾之间,然后第二个的m改为str2[end])关键是直接操作目标串,凡是目标串有重复的字符,前这里面所有的字符与原串不同的就原创 2016-03-16 20:32:53 · 608 阅读 · 0 评论 -
uvalive4987
题意:有m个避难所n个修工队,给出各自距离公路的最短距离,要求所有的避难所都要有队并且要求距离最短思路:对避难所的距离以及修工队的距离进行排序,那么如果要确保所有的避难所都要住人首先要一一对应,在对应完后在考虑重住的情况那么这一操作带来的结果就是在考虑完对应避难所后,递减来的前一个是重住到前一个的是最优解,再前一个是一个重住到在前一个的最优如此类推输出来的dp[m-1]就是最优原创 2016-03-17 17:10:59 · 392 阅读 · 0 评论 -
uvalive 4015 caves
题意:求路径不长于x经过最多不同结点的路径的结点数思路:代码:#include#include#include#include#includeusing namespace std;const int maxn = 550;vector g[maxn];int d[maxn][maxn][2];int n, son[maxn], cnt[maxn];void原创 2016-03-17 18:28:11 · 335 阅读 · 0 评论 -
uvalive 4613
题意:有一条道,只能走一辆车,然后车有正向反向,正向的车至少隔10才能再开同方向的车,反向的不能同时开思路;d[i][j][0],d[i][j][1]分别表示在开了这么多辆的正向和反向后最后一辆是正向是反向的最少时间那么,在交叉讨论之后同方向枚举是可以得到所有交叉情况,那么对于同方向的车,开始时间至少是上个车的开始时间+10以及本量车的开始时间,结束时间至少是商量车的结束时间+原创 2016-03-18 20:37:31 · 278 阅读 · 0 评论 -
UVA 10401 Injured Queen Problem
题意:给出一个串,每个位置代表这个列所指定的行,如果是?则是任意行,而每个位置一旦占有,则周围一圈以及此列都不再可以放东西思路:题目的意思很明显,每个列只能放一个皇后,枚举每一列所有可行的位置(如果此列有指定的行,则只有一种),然后累加前面一列的可放置的行(不在四周)的放置情况数,一直累加到最后一行累加的技巧:如果是指定行,则要枚举所有的行,如果行与行之间相差至少2(不相邻),原创 2016-02-25 17:15:13 · 311 阅读 · 0 评论 -
Walking on a Grid uva10913
题意:给出n*n的数,要求从1,1到n,n,且沿路不可有超过k个的负值,求最大的总和思路:用一个数组标记考虑的情况是否已经算出,一个数组标记是否位置重复,一开始觉得只要map初始化为inf然后如果不是inf的化就是经过计算了,不需要vis,后来发现就算经过计算map也会是inf,所以行不通,还是得要两个数组来标记dp函数就是计算如果采用data[q][w]的话,那么最优解是什么.原创 2016-02-25 20:01:35 · 235 阅读 · 0 评论 -
uva116
题意:从左往右走,使得得到的行数的字典集尽量小,且得到的总和最小思路:逆向dp保证字典集尽量小代码:#include#include#include#includeusing namespace std;int m, n;int maps[11][101];int smap[11][101];int fath[11][101];int main() { whil原创 2016-04-04 11:42:09 · 338 阅读 · 0 评论 -
UVA 607 Scheduling Lectures
题意:给出一节课的时长l以及不满意计算值c,给出n个主题的时长,求怎样安排主题最后的不满意度最低思路:首先计算到i个主题所耗费时间,存在sum里面,用于之后计算一节课占用时间枚举节数,枚举到此节所能涵盖的知识点数,枚举上节课涵盖的知识点数那么这节课的不满意度可由sum[j]-sum[k](第i节用时)算出当然节数和可涵盖的知识点数从小到大,这样才能保证利用之前计算出的结原创 2016-02-25 21:15:00 · 244 阅读 · 0 评论 -
uva10131
题意:求大象从重量递增且智商递减的序列的最长,并打印最长序列思路:dp[cur]表示以cur为结尾的最长,很好理解code:#include#includeconst int N = 10005;struct state { int w, s;}tmp[N];int n, dp[N], vis[N];int find(int cur) { if(dp[cur]原创 2016-04-04 12:05:19 · 258 阅读 · 0 评论 -
uva10099
题意:有一个旅游团现在去出游玩,现在有n个城市,m条路。由于每一条路上面规定了最多能够通过的人数,现在想问这个旅游团人数已知的情况下最少需要运送几趟思路:求全局沿路权值最大,并记录最大权值这条路上的最小权值,用floyd代码:#include#include#includeusing namespace std;const int N = 105;int n,原创 2016-03-11 14:47:27 · 200 阅读 · 0 评论 -
Robots(II) uva10599
题意:一个机器人,只能往下或者往右走,求其能拾到的最多垃圾数,统计能拾到最多垃圾数的路径,然后输出一条路径思路:用一个数组g,递增的存储垃圾所在的格数-1,那么g[i]%c即时这个垃圾在的列数-1枚举所有的垃圾,再枚举在其之前的垃圾,如果这个垃圾的g[i]%c>=g[j]%c,那么可达,此时就要判断dp[i] dp[i] == dp[j]+1, 路径数累加,即有多个通向i的原创 2016-02-26 15:53:35 · 303 阅读 · 0 评论 -
Antimatter Ray Clearcutting uva11008
题意:给出n棵树的位置以及要消灭的树的数量m,同一直线上的树可一枪消灭,求最少枪支数思路:记忆化搜索,将树是否存在用二进制表示,一开始则是(1然后枚举所有的树,与当前的状态st相与判断树是否消灭,然后枚举其后的数,再枚举可能与之前枚举的两棵在同一直线上的树,如果在直线上,则可消灭最后取当前花费枪支的最小值技巧携带还需消灭的树会简化代码代码:#include原创 2016-02-26 16:44:55 · 273 阅读 · 0 评论 -
Partitioning by Palindromes uva111584
main algorithm:to count how many Palindromes a string includegive out all the way it combine, and judge whether its a Palindromes, if it is, f[i] = min(f[i]. f[j-1]+1)code:#include#inclu原创 2016-03-12 19:57:42 · 291 阅读 · 0 评论 -
uva10285
找出最长的严格递减序列。记忆化搜索#include#include#include#includeusing namespace std;char s[100];int g[105][105];int dp[105][105];int r,c;int vis[105][105];int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};i原创 2017-03-22 15:59:24 · 349 阅读 · 0 评论