自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 uva 11008(dp + 状态压缩)

题意:有n个点,然后需要删除m个点,在一条线上的点可以被删除,问最少几条线可以删除到m个点。题解:状态压缩,s[i][j]存了i,j所在直线穿过的所有点,并把的他们的标志位设为1,然后递归,状态数sta的所有位设为1,删除掉的设为0,结束标志是剩余1的位数小于n-m,状态数sta和s[i][j]与非运算后可以删除和i,j在一条线上的所有点,f[sta]表示在sta状态下最少条线能删m个点。

2014-12-31 17:39:44 657

原创 uva 10913(dp)

题意:给出一个n*n网格,每个网格里都有一个数字,一个人要从(1,1)走到(n,n),要求只能向左走或向右走或向下走,不能走重复的格子,且走过格子是负数的个数不超过k,问走到(n,n)走过格子最大和是多少,如果无法满足条件输出Impossible。题解:f[r][c][cnt][d]表示走到第i,j个格子时已经走了cnt个负数格子,且面朝方向d(0:下 1:右 2:左),递归找路径就可以了。

2014-12-31 15:29:30 673

原创 uva 12299(线段树)

题意:线段修改时要把选出来的数字全部右移一位修改掉。题解:单点修改线段树模板题,把挑出来的逐个单点修改就好。#include #include #include using namespace std;const int N = 400000;const int INF = 0x3f3f3f3f;int s[N], l[N], r[N], a[N], b[N], b1[N];

2014-12-28 21:15:22 716

原创 hdu 1166(线段树)

题解:单点修改模板题#include #include #include using namespace std;const int N = 200000;const int INF = 0x3f3f3f3f;int s[N], l[N], r[N], a[N], l1, r1, u, x;int flag;void build(int k, int left, int ri

2014-12-28 21:12:01 637

原创 hdu 1754(线段树)

题解:单点修改线段树模板题。#include #include #include using namespace std;const int N = 800000;const int INF = 0x3f3f3f3f;int s[N], l[N], r[N], a[N];int n, m, l1, r1, u, x;void build(int k, int left,

2014-12-28 21:08:49 475

原创 uva 10791

题意:一个序列的数的LCM值是n,要求输出这个序列的最小和。LCM是指这串序列的最小公倍数。题解:从小到大找到n所有的因子,因子从2开始到sqrt(n),因为n的因子如果有比sqrt(n)大也只会存在一个,然后分三种情况,已经写在注释中。#include #include #include int main() { long long n, res; int cas = 1

2014-12-28 18:29:54 559

原创 uva 11121

题意:给出一个十进制的数字,输出他的-2进制数。题解:-2进制与2进制的区别是在奇数位会减去这个数字而不是像2进制一样加上这个数,所以需要将当前余数和后面一位的余数更改来填补前一位的增加或减少。#include #include const int N = 100;int n, res[N];int main() { int t, cas = 1; scanf("%d",

2014-12-28 13:35:51 519

原创 uva 10604(dp + 回溯)

题意:给出化学反应的式子和热量的变化,还有k个试管里存放的原料,问怎样让这些试管内的原料互相发生反应使产生的热量最少。题解:用f[a][b][c][d][e][f]保存,各原料还分别剩a,b...f个试管时最少产生的热量是多少,然后普通回溯,直到最后剩余一个试管原料时停止。#include #include const int N = 11;const int INF = 0x3

2014-12-27 22:26:06 766

原创 uva 10673

题意:给出x和k,满足,输出p和q。#include int main() { int t; long long x, k; scanf("%d", &t); while (t--) { scanf("%lld%lld", &x, &k); if (x % k) printf("%lld %lld\n", -x, x); else printf("0 %

2014-12-27 13:18:09 583

原创 uva 607(dp)

题意:一个人要开讲座将n个专题,每场讲座l分钟,每个观众的耐心是c,然后给出n个专题需要讲的时间,问最少几场讲座能把专题讲完,观众的不满度的和是多少。规则是这样,讲座的时间必须大于等于k个专题的时间和,剩下的时间t如果在十分钟内,观众不满度会降低c,大于10的观众的不满度会增加(t-10)^2,专题要按顺序讲解。题解:需要两个dp数组迭代,num[i]表示i个专题最少开几场讲座,f[i

2014-12-26 20:54:54 549

原创 uva 106

题意:给出一个n,问小于等于n的数中有多少组互质勾股数,除了所有勾股数外还有多少个数字。题解:有一个勾股数的公式,其中a b c是勾股数。int a = i * i + j * j;int b = 2 * i * j;int c = i * i - j * j;然后将a、b、c扩大k倍(小于等于n),避免遗漏,然后写gcd函数判断是否互质。#include #in

2014-12-25 21:01:30 824

原创 uva 10118(dp + 回溯)

题意:小明要拿糖果,糖果有4叠,每次只能从任意一叠糖果的顶部拿一颗糖放到篮子里,如果篮子里的糖果出现颜色一样的就拿出这对糖果,篮子里的糖果最多5个,问最多可以拿出多少对颜色相同的糖果。题解:用f[i][j][k][l]存4叠糖果拿了i,j,k,l个时最多能拿出几对糖果。回溯,中间可以通过f数组减少时间。#include #include const int N = 45;int n,

2014-12-25 19:15:37 533

原创 uva 10626(dp)

题意:一个人要在自动贩卖机买可乐,给出需要可乐的数量n,以及1分钱,5分钱,10分钱的个数,一瓶可乐8分钱,如果给了10分钱会找两个1分钱,其他情况同理,自动贩卖机每次会找最少数量的硬币数,问最少投几次硬币可以买到n瓶可乐,假设钱一定足够。题解:买一瓶可乐一共5种情况,4种找1分钱和1种找5分钱(1个10分,3个1分),因为尽可能找钱时数量少所以面额会越大,递归直到买到足够数量的可乐。

2014-12-24 17:37:04 802

原创 uva 662(区间dp)

题意:有n个饭店,要在n个饭店中选k个建立补给站给距离最近的饭店补给,给出n个饭店的位置,问补给站建在哪k个饭店并且将饭店和自己的补给站的距离和输出。题解:f[i][j]代表在前j个饭店建i个补给站的距离和。先用一个dis[i][j]表示从i到j建立1个补给站的总距离(一定是(i + j) / 2这个距离其他几个点距离和最小),那么状态转移方程就是f[i][j] = min{f[i][j],f

2014-12-23 21:57:33 636

原创 uva 10564(dp)

题意:一个漏斗形的图形每个方块内都有值,然后给出一个目标值,要求从第一行走到最后一行,使一整条路径上所有值的和是目标值,打印路径条数和字典序最小的路径,如果不存在输出空行。题解:f[i][j]k]代表在第i行第j列还剩k的值的经过这个点的路径条数。根据漏斗分上下两部分,我们也需要分两部分讨论,上半部分状态转移方程f[i][j][k] = f[i + 1][j - 1][k - arr[i][j

2014-12-23 19:36:37 532

原创 uva 10635(最长公共子序列nlogn)

题意:给出两个串,输出最长公共子序列。题解:直接用n^2的方法会超时,需要将问题转化成计算最长上升子序列,然后可以用二分来减小时间复杂度。方法是用一个数组将第一个串内元素在第二个串内的位置保存下来,然后将这个数组的最长上升子序列长度求出就是解。#include #include #include #include using namespace std;const int

2014-12-21 22:46:01 839

原创 uva 10911(dp+状态压缩)

题意:有2×n个人组成n队,每队两人,给出了所有人的位置坐标,输出n队人两两之间之间的最小距离和。题解:这是一个集合上的最小动态规划,最优配对问题,用一个集合S表示当前人是否已经组队的状态,枚举所有情况,从0到1#include #include #include #include using namespace std;const int N = 1 << 21;cons

2014-12-21 18:11:34 562

原创 uva 11151(dp)

题意:给出一个字符串,要求输出字符串中的最长的回文子串的长度。题解:递归dp,f[i][j]代表从i到j的字符串内最长回文串长度。#include #include const int N = 1000;char str[N];int f[N][N];int dp(int l, int r) { if (f[l][r] != -1) return f[l][r];

2014-12-19 23:39:13 557

原创 uva 10891(dp+博弈)

题意:给出一个长度为n的数字序列,有两个玩家A、B,每次都是A先取数字,每个人每次都要取连续的1个或多个数字,不能同时从两端取数字,每个人都尽量用最优的方式来取,使自己取到的数字的总数最大。问最后A和B最大的差距是多少。题解:因为每个人都以最优的方法取数字,无法确保自己取了最大值后就可以让自己达到最优,所以思路应该是每次选出当前选择区间内的最小值,然后这个值是给对方的,自己选的值就是当前区

2014-12-18 19:29:33 541

原创 uva 10401(dp)

题意:n皇后问题,输入一行字符串,长度是n就是n*n的棋盘,如果字符是‘?’就是这一列任意位置都可以摆放皇后,如果i是1~F,是这一列第i行必须摆放一个皇后。题解:f[i][j]数组是在第i行第j列摆放皇后的总方法数,状态转移方程f[i][j] += f[i - 1][k] (|j - k| > 1)。最后把最后一列的方法数加起来就是总的方法数。#include #include

2014-12-17 20:32:26 577

原创 uva 10313(硬币dp)

题意:给出一个n,从1到n的不同面值的硬币不限数量有多少方式凑成n,如果又给出一个l1,代表用小于等于l1数量的从1到n面值的硬币有多少方式凑成n,如果又给了l2代表数量大于等于l1小于等于l2数量的从1到n面值的硬币有多少种方式组成n。题解:用了之前一直用的递归方法超时,因为每次都要预处理f[i][j]数组(f[i][j]代表面值不超过j凑成i的方案数)。递推+打表,用不超过j个硬币凑出面值

2014-12-16 20:08:03 594

原创 uva 10029(dp)

题意:给出一些字符串,从中选出一个的序列,是他相邻的两个字符串的区别是相差一个字符,问这样的序列最长是多少。题解:用一个f[i]数组存前i个字符中存在的最长子序列的长度,每输入一个字符串,就将字符串增删改操作然后和之前的字符串对比,如果存在一个相等的字符串str[i]就得到其f[i],选出最大的赋给当前输入的字符串的f[n]中。#include #include #include

2014-12-13 22:02:46 645

原创 uva 10453(dp)

题意:给出一个字符串,然后添加最少数量的字母构建成为一个回文串,输出最少添加多少个字母,并输出新的回文串。题解:很容易得到添加最少数量字母成为回文串,直接递归更新f[i][j]数组(从i到j的字符串最少添加数量)。然后注意输出新的回文串需要根据计算得出的f[i][j]递归输出,从左到右逐个字母输出。#include #include const int N = 1005;char

2014-12-11 21:27:46 535

原创 uva 10201(dp)

题意:一个人要从城市a开车到城市b,他的车每走一公里耗费一升油,车上最多放200升的油,然后给出了路上的一些加油站点距离初始位置的距离和每升油的单价,当人从城市a离开时,车上有100升油,如果可以到达城市b且到达是车上的油大于等于100升,则输出最小加油花费,否则输出impossible。题解:s[i].d是第i个站点的距离,s[i].m是第i个站点的每升油价格,f[i][j]代表在第i个

2014-12-10 21:10:10 619

原创 uva 10154(dp)

题意:有一堆海龟要尽可能的叠起来,每个海龟有自己的重量和承重力,每个海龟可以扛起承重力减自身重量大的重量,问海龟最高叠几层。题解:用一个f[i][j]数组表示有i个海龟可以叠j层的最小总重量,从上往下叠,重量越少叠放的越多,状态转移方程是f[i][j] = max{f[i - 1][j], f[i - 1][j - 1] + turtle[i].w} ,当f[i - 1][j - 1]存在,并

2014-12-09 23:07:18 596

原创 uva 11137(硬币dp)

题意:有从1^3到21^3一共21种面额的硬币,给一个目标值问有多少种方法。题解:和之前做的一样,链接#include #include const int N = 10005;int coin[22], n;long long f[N][22];long long dp(int k, int cur) { if (f[k][cur] != -1) return f[k]

2014-12-09 19:54:11 524

原创 uva 10617(dp)

题意:给出一个字符串,可以进行删除操作让他形成一个回文串,问有多少种删除方式可以成为一个新的回文串,不删除也算一种方式。题解:dp思想是从两边向中间递归寻找,如果递归到只剩一个字母就已经是一个回文串了,返回1使删除方式加一,如果f[l][r]之前已经被计算过了,就直接返回,如果两端字符相同那么相当于多了一种两端同时删除的方式,所以f[l][r] += f[l + 1][r - 1] + 1,然

2014-12-08 01:01:29 533

原创 uva 10271(dp)

题意:从n个筷子中挑选n+8个三根筷子的集合,假如三根筷子按从小到大是a,b,c,那么让8+k个总(a-b)^2的值最小。题解:用一个f[i][j]数组表示前j个筷子组成i个集合的总最小(a-b)^2值,所以dp思想就是f[i][j] = min{f[i][j - 1], f[i - 1][j - 2] + (cho[j] - cho[j - 1])^2},也就是不选cho[j]时,f[i][

2014-12-07 00:19:21 564

原创 uva 10304(dp)

题意:给出n个结点,建立一个二叉搜索树,求这棵树的最小值(每个结点×它的深度的总和)。题解:dp[i][j]数组保存从结点i到j的组成的树的最小值,dp的思想是先从小到大计算有num个结点组成这棵树,然后枚举左右结点,以及从左右结点中挑选一个点作为根节点,那么如果此时将下标小于root大于l作为左子树,下标大于root小于r作为右子树,加上选出的这些结点的自身权值(深度加一,累加上去),再减去

2014-12-03 22:05:33 602

原创 uva 10739(dp)

题意:给出一个字符串,可以增加一个字母或者删除一个字母,或者替换任何一个字母,都需要一次操作,问最少需要几次操作可以是字符串成为回文串。题解:这三个操作中增加一个字符或删除一个字符作用是一样的,做法是从两边推到中间,先用两个指针指向两端,如果字符串最两边的字符是一样的可以直接左右指针加一减一向内推进,否则有三种情况,判断如果左边指针右移一位或者右边指针左移一位(相当于添加删除操作),或者是各向

2014-12-02 20:01:29 505

空空如也

空空如也

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

TA关注的人

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