![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
AcToy
有志者 事竟成
展开
-
poj2096 - Collecting Bugs
http://poj.org/problem?id=2096深深的被这个题给坑了,题意叙述的就比较麻烦。最纠结的是在输出的时候用%.4lf就是WA,用%.4f就AC了,不明白什么原因。题意:给n个bug,s个子系统,某人一天会发现一个bug,这个bug属于某种类型的bug,发生在某个子系统上,这样dp[i][j]表示的是j个子系统中找到了i个bug,这样概率应该为i / n * j /原创 2013-07-18 13:59:03 · 998 阅读 · 0 评论 -
UVa 437 - The Tower of Babylon
每一种箱子都有6种情况,没两个边都可以当底面,另一个边做高。排序后找面积符合情况下的高度最长上升子序列即可。// File Name: UVa437.cpp// Author: Toy// Created Time: 2013年05月03日 星期五 18时20分12秒#include #include #include #include #include #i原创 2013-05-03 18:47:42 · 535 阅读 · 0 评论 -
UVa 10404 - Bachet's Game
opt[i] = 1 表示剩i个石子时 Stan wins。用A[]数组表示 m 堆的个数情况。opt[0] = 0 ( 0个石子 Ollie wins,所以为0 )。当 i >= A[j] 且 opt[i - A[j]] == 0 此时表示的是石子数为i - A[j] 时Ollie wins,故可以推出opt[i] = 1。 // File Name: UVa10404.cpp// A原创 2013-05-03 21:55:20 · 546 阅读 · 0 评论 -
UVa 10285 - Longest Run on a Snowboard
记忆化搜索,对d[i][j] 需要考虑 d[i - 1][j], d[i + 1][j], d[i][j - 1], d[i][j + 1]四种情况,但是需要注意边界的控制。 #include #include #include #include #include using namespace std;int Case, R, C, A[105][105], opt[10原创 2013-05-03 17:54:52 · 408 阅读 · 0 评论 -
UVa 10465 - Homer Simpson
背包问题,要求出重量恰好是t的最大价值 (每个物品的价值是1)。此题分为恰能达到重量t和不能达到重量t两种情况。再求背包的过程中要注意。 #include #include #include #include #include using namespace std;int m, n, t, opt[10005], V[3];int main ( ) { whi原创 2013-05-03 13:53:12 · 451 阅读 · 0 评论 -
UVa 531 - Compromise
求最长公共子序列,输出路径,a[i][j]为到第i行第j列时最长的公共子序列,所以在输出路径的时候,讲a[cnt1][cnt2]从后遍历排除不是的情况,再用path记录路径就可以。 #include #include #include #include #include using namespace std;string str1[101], str2[101], s,原创 2013-05-03 11:53:38 · 472 阅读 · 0 评论 -
UVa 624 - CD
价值和重量相等的特殊背包。所以求法还是0/1背包的求解过程,还是需要输出长度,所以用path[i][j]记录 i ( 从后往前记录 ) 然后递推输出即可。// File Name: UVa624.cpp// Author: Toy// Created Time: 2013年04月16日 星期二 18时55分04秒#include #include #include #in原创 2013-04-16 20:10:02 · 915 阅读 · 0 评论 -
HEU Monkey CC
这个题和之前做过的接馅饼的题类似。用opt[i][j][t] 表示第i秒时在位置j上跳跃的次数为t是所得的最大香蕉数。这样有三个状态可以考虑,在第i - 1秒是 在位置j,位置j - 1,位置j + 1三个位置。所以转移方程为 opt[i][j][t] = max ( max ( opt[i - 1][j- 1][t - 1], opt[i - 1][j + 1][t - 1] ), opt[原创 2013-04-24 12:58:29 · 525 阅读 · 0 评论 -
HEU The message
囧啊,读错题了,一直在想为什么是DP。误以为当时间相同是可以一起删除。后来发现并非如此。用ans[i]记录前i条信息全部删除的最短时间,dele[i][i]表示删除第i条信息所需的时间,opt[a][b]是从a到b一起删除的时候所需的时间。用结构体表示 到达时间 ( arr ),删除所需时间(cost )。转移方程为 cnt = max ( ans[j], mess[i].arr ) + op原创 2013-04-23 22:42:36 · 446 阅读 · 0 评论 -
UVa 348 - Optimal Array Multiplication Sequence
矩阵链乘的问题,好像很多算法书上讲DP都是开始就将矩阵链乘。这个题不是要求最小的运算量,而是求最优的方案是什么,难就难在了递归的输出,如何记录路径,如何输出。我也是参看了别人的代码。递归输出。不过这个转移方程还是蛮好找的。dp[i][j] = min ( dp[i][k], dp[k + 1][j], p[i - 1]p[k]p[j] ).// File Name: UVa348.原创 2013-04-15 19:38:37 · 477 阅读 · 0 评论 -
UVa 10130 - SuperSale
就是简单的背包,我是把W, V输入反了,导致一直输出都是0,一直改了好久。思路 G 一共才 30,打表的思想,将所有情况用f数组记录,最后 ans+=f[mw],用了滚动数组。// File Name: UVa10130.cpp// Author: Toy// Created Time: 2013年04月15日 星期一 17时42分16秒#include #include原创 2013-04-15 18:36:21 · 560 阅读 · 0 评论 -
HEU_ Who Is In Front of Me
num个数,1 - num 。A[i]代表第i个人的身高,第i个人只能看见他前面的比他高的,也就是从第i个人到头找最长上升子序列,Case为50000所以需要优化,用id表示从i能看见的最高人的的位置。 #include #include using namespace std;int Case, A[50005], dp[50005], num;int main ( ) {原创 2013-04-23 16:12:03 · 685 阅读 · 0 评论 -
hdu1203 I NEED A OFFER!
刚看到题,思路不是很清晰,不过考虑了一会就想到了0-1背包问题了。拿到的OFFER 1 - m 份。在资金允许的范围内求至少拿到一份OFFER的概率,也就是求拿不到OFFER的概率f[j].f[j] = min ( f[ j - a[i] ] * ( 1 - b[i] ], f[j] ).ans = 1 - f[j]; #include const int MAXN原创 2012-11-20 18:50:40 · 252 阅读 · 0 评论 -
UVa 562 - Dividing coins
背包问题,开始还以为是分硬币的问题来着。假设一个人将硬币全拿了,领opt[0] = true .从sum开始递推。如果opt[j - A[i] ] = true, 那么opt[j] = true。开始数组开小了,两次RE。记住opt数组开大一些。。 #include #include #include #include #include const int MAXN = 110;原创 2013-04-09 17:28:22 · 310 阅读 · 0 评论 -
UVa 11137 - Ingenuous Cubrency
听取了老大的建议,说记忆化搜索由于数据较大比较费时,所以直接上的递推,过的比较轻松。 #include #include #include #include #include using namespace std;int Case, A[25];long long dp[10005];int main ( ) { for ( int i = 1; i <= 2原创 2013-05-03 22:34:59 · 454 阅读 · 0 评论 -
UVa 10617 - Again Palindrome
字符串的DP,用d[i][j] 表示 i和j ( i 所以有两种情况 当 str [i] == str[j] 时 的d[i][j] >?= dp ( i + 1, j ) + dp ( i, j - 1 ) + 1.当str[i] != str[j] 时 d[i][j] >?= dp ( i +1, j ) + dp ( i, j - 1 ) - dp ( i + 1, j - 1 ) (原创 2013-05-05 20:35:46 · 495 阅读 · 0 评论 -
UVa11584-Partitioning by Palindromes
http://uva.onlinejudge.org/external/115/11584.html将所给的字符串,最少可以分成多少个回文串,dp[i]表示0~i之间最少可以分成的值,然后判断j~i(j /************************************************************************* > File Name: UVa11原创 2013-07-18 10:23:34 · 640 阅读 · 0 评论 -
hdoj4405-Aeroplane chess
求期望值,体重说明,如果可以flight的话就直接到达规定那个点,用f数组将两个点连在一起就可以,反之,就要求打骰子后的期望啦,e[i] =∑(e[i + k] * 1 / 6) + 1(k为点数1~6,1/6为致筛子的概率,因为不可以flight就要置一次筛子,所以+1)。/*********************************************************原创 2013-07-17 15:35:12 · 600 阅读 · 0 评论 -
hdu3853-LOOPS
接触的第一道概率dp,这个题和以前做的唯一区别就是加了一个概率,但是也是参照了别人的思路做出来的。dp[i][j]表示在第i,j格子所期望的。p[i][j][0], p[i][j][1], p[i][j][2]分别表示三种传送的概率。dp[i][j] = p[i][j][0] * dp[i][j] + p[i][j][1] * dp[i][j + 1] + p[i][j][2] * dp原创 2013-07-17 09:38:27 · 714 阅读 · 0 评论 -
UVa 10074 - Take the Land
这题和836一样,输入比那个简单的很多。/************************************************************************* > File Name: 10074.cpp > Author: Toy > Mail: ycsgldy@163.com > Created Time: 2013年05月2原创 2013-05-24 21:05:49 · 487 阅读 · 0 评论 -
UVa 836 - Largest Submatrix ( 最大01矩阵)
求所有连续1的最大和。/************************************************************************* > File Name: 836.cpp > Author: Toy > Mail: ycsgldy@163.com > Created Time: 2013年05月24日 星期五 13时3原创 2013-05-24 20:29:46 · 827 阅读 · 0 评论 -
UVa 108 - Maximum Sum (最大子矩阵)
/************************************************************************* > File Name: 108.cpp > Author: Toy > Mail: ycsgldy@163.com > Created Time: 2013年05月24日 星期五 12时56分02秒 ******原创 2013-05-24 13:19:55 · 591 阅读 · 0 评论 -
UVa 10534 - Wavio Sequence
LIS 朴素算法时间是 n ^ n, 会超时,所以需要用到时间复杂度nlogn的方式。是用到的二分查找的方式。用一个栈来维护整个序列,当A[i] 大于栈顶的元素,则将A[i]放入栈顶。否则找到恰好不小于A[i]的元素的位置,用A{i]替换他,最后top就是整个序列的最长上升子序列。/***************************************************原创 2013-05-09 15:27:30 · 708 阅读 · 0 评论 -
UVa 825 - Walking on the Safe Side
这题的输入很坑人,和我在蓝桥杯比赛中遇到的一个题一样,每行输入不顾定的字符。这题的转移方程很好找,因为要求时间少,因此对于位置i, j 只能从左边或者上边走到,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]/*********************************************************************原创 2013-05-09 05:53:54 · 483 阅读 · 0 评论 -
UVa 10069 - Distinct Subsequences
高精度的运算,,所以用了JAVA的大数。用b表示长串,a表示短串。dp[k][j]表示的是短串的位置k之前的子串在长串位置j之前出现的次数。所以当str[j] == str[k] dp[k][j] += dp[k - 1][j - 1]不过在对dp[k][j]进行初始化的时候要特别注意 import java.math.BigDecimal;import java.math.原创 2013-05-07 06:43:30 · 483 阅读 · 0 评论 -
UVa 10911 - Forming Quiz Teams
集合上的dp问题,和佳神给的例题是类似。d (S ) 表示是把集合S中的元素两两配对后的最小距离和。d(S)= min { |Pi Pj| + d ( S - {i} - {j} )}; #include #include #include #include const int MAX = 10;const int INF = 1 << 30;using namespac原创 2013-05-07 07:20:01 · 671 阅读 · 0 评论 -
UVa 620 - Cellular Structure
// File Name: UVa620.cpp// Author: Toy// Created Time: 2013年05月07日 星期二 10时53分39秒#include #include #include #include #include #include #include #include #include #include #include #inclu原创 2013-05-07 11:04:01 · 742 阅读 · 0 评论 -
UVa 10739 - String to Palindrome
将所给的字符串 经过 插入,删除,修改等操作形成回文串。没操作一次花费一个时间,求花费最小的时间。仔细想一下,删除和插入操作是一样的。dp [i][j] 表示i ~ j 是回文串时的最小操作时间。对于删除和插入操作 dp[i + 1][j], dp[i][j - 1]。而修改是将i 和 j位置改成了一样的,所以 dp[i + 1][j - 1]转移方程为 ans = min ( dp原创 2013-05-05 20:44:55 · 623 阅读 · 0 评论 -
UVa 11151 - Longest Palindrome
求最长回文子序列,将所给字符串反制后,求与原串的最长公共子序列// File Name: UVa11151.cpp// Author: Toy// Created Time: 2013年05月05日 星期日 22时07分03秒#include #include #include #include #include #include #include #includ原创 2013-05-05 22:40:32 · 516 阅读 · 0 评论 -
UVa 357 - Let Me Count The Ways
还是硬币的问题,开始毫不犹豫的按之前的思路。写完,提交,WA。很尴尬。也用了long long。不知道什么原因30000这个就是表示不出来。找到了WA的原因,真是一头雾水啊。后来看了discuss发现有用一维数组的。于是想起了看过滚动数组可以优化。于是抱着尝试的态度。用了滚动数组优化。结果TLE,TLE的原因就是没有加 != EOF 时间居然是是3.000 和 0.016 居然差这么多。真的很诧原创 2013-04-09 10:55:30 · 480 阅读 · 0 评论 -
UVa 10192 - Vacation
还是一道LCS的问题,记住在输入的时候用getline或者是gets否则WA #include #include #include #include #include using namespace std;string s1, s2;int dp[105][105], Case;int LCS ( string s1, string s2 ) { int m原创 2013-04-08 15:29:36 · 495 阅读 · 0 评论 -
hdu1355 The Peanuts
单纯的贪心就可以 #include #include #include using namespace std;struct PEA { int row, column, data;}pea[2505];bool cmp ( PEA a, PEA b ) { return a.data > b.data;}int ct, num, m原创 2013-01-12 19:28:46 · 426 阅读 · 0 评论 -
hdu1422 重温世界杯
环形最长非负子序列因为 数据 是 100000 因此遍历两次必超时而且要求第i个城市可以回到第1个城市因此用dp[i] 和 dp[i + ct] 表示 第 i 个城市的 w - l所以只要一次遍历只要num累加的和 大于等于 0 就可以因为最多就能访问ct个城市所以只要 tmp > ct 就 break还可优化下#include原创 2013-01-14 11:45:00 · 1094 阅读 · 0 评论 -
hdu1421 搬寝室
给n个数。选出k个数。使疲劳度最小疲劳度是两手物品重量差的平方dp[i][j]表示从i个物品选j个的最小疲劳度所以dp[i][j] = min ( dp[i - 1][j] , dp[i - 2][j] + ( w[i] - w[i - 1] ) * ( w[i] - w[i - 1] ) ) #include原创 2013-01-14 18:47:08 · 343 阅读 · 0 评论 -
hdu1466 计算直线的交点数
找出n条线有多少种不同的交点。从小到大输出。dp[i][j] == 1表示 i条线有 j 个交点。也是看了别人的题解才弄明白i 条线最多有 i * ( i - 1 ) / 2 个交点求 i 条线有多少交点。考虑 j 条 平行线,和 i - j条自由线。k表示 i - j条自由线的交点。则此时 i 条线可有 i * ( i - j ) + k 个交点原创 2013-01-14 19:58:37 · 890 阅读 · 2 评论 -
UVa231 - Testing the CATCHER
题目很绕,就是求最长下降子序列。但要注意最后一个输出行没有空行。// File Name: UVa231.cpp// Author: Toy// Created Time: 2013年03月15日 星期五 15时45分09秒#include #include #include #include #include #include #include #inc原创 2013-03-15 16:23:16 · 813 阅读 · 0 评论 -
UVa10405 - Longest Common Subsequence ( 最长公共子序列 )
只要在输入的时候注意space即可。没难度。。。#include #include #include #include #include using namespace std;string str1, str2;int a[1005][1005];int LCS ( string s1, string s2 ) { int m = s1.length (原创 2013-03-02 10:55:12 · 341 阅读 · 0 评论 -
UVa 674 - Coin Change
“硬币问题”经典的记忆化搜索。注意找的是有多少种类。而不是最少用多少硬币。将正常的算法改为2维的即可。。。#include #include #include using n原创 2013-03-01 16:34:08 · 280 阅读 · 0 评论 -
UVa103 - Stacking Boxes
矩形嵌套,矩形之间的“可嵌套”关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形X可以嵌套在Y里,我们就从X到Y连一条有向边。这个有向图是无环的,因为一个矩形无法直接或间接地嵌套在自己内部。就是求DAG上的最长路径。用d[i]表示从节点i出发的最长长度。最终求的答案就是d[i]中的最大值。#include #include #include usi原创 2013-02-28 20:50:57 · 269 阅读 · 0 评论 -
UVa 111 - History Grading (最长公共子序列)
就是在输入的时候遇到了点麻烦。直接敲的模板。。。#include #include #include const int MAXN = 25;using namespace std;int correct_order[MAXN], student_order[MAXN], Case, dp[MAXN][MAXN];void LCS ( ) { for ( int原创 2013-02-27 17:00:44 · 520 阅读 · 0 评论