自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蚂蚁大战大象

https://github.com/zxjcarrot/

  • 博客(47)
  • 收藏
  • 关注

原创 ZOJ 1003 Crashing Balloon(DFS)

两个数A,B能不能通过1-100内的数相乘得到,每个数只能用一次,并且两个数不能有除了1之外的公共因子.3种情况:1.k做A的因子.2.k做B的因子.3.k不做任何数的因子.#include #include #include using namespace std;const int MAX = 102;bool vis[MAX], madeit;bool dfs

2014-03-31 22:08:13 392

原创 POJ 1745 Divisibility

题意:给出N数字,在N个数字中放入N - 1个+,-号,判断是否存在一种放置方案,使得结果能整除K,设dp[i][j]为前i个数字除K的余数j是否存在,那么答案就是dp[N][0]是否为true.因为(a + b) % c == (a % c + b % c )  % c, (a - b) % c == (a % c - b % c)  % c那么dp[i + 1][(j + val[

2014-03-30 12:58:57 810

原创 vijos P1180 选课

题目地址:P1180 选课多叉的情况不好做,所以可以转换成二叉树.那么设dp[i][j]为以i为根节点的子树上选择j门课.dp[i][j] = max(dp[right][j], dp[left][k - 1] +dp[right][j - k] + credit[i] | 1因为转换成了二叉树,所以任何节点i的右节点是其多叉树上的兄弟节点,左节点才是多叉树的子树.所以dp[r

2014-03-29 21:07:33 1155

原创 TYVJ P1047 - 乘积最大(DP)

题意:给出一个数字串,把它划分成K + 1份,使其乘积最大.类似矩阵连乘的DP 设dp[i][j][p]为区间[i, j]划分成p份的最大乘积.那么dp[i][j][p] = max(dp[i][k][p - 1] * val[k + 1][j]) val[i][j]为数字串i到j的值.base case: dp[i][j][1] = val[i][j]#include #inc

2014-03-29 18:54:08 878

原创 TYVJ P1203 - 机器分配

题目地址:TYVJ P1203 - 机器分配简单DP 设dp[i][j]为前i个公司分配j个机器能得到的最大利益dp[i][j] = max{prof[i][k] + dp[i - 1][j - k] | 0#include #include #include using namespace std;const int MAX = 101;int dp[MAX][MAX

2014-03-29 12:45:47 874

原创 ZOJ 3726 Alice's Print Service

题意:打印服务,打印[S(i), S(i+1)]内张纸需要Pi元一张,随着张数的增加,价格非递增,给出m个询问打印的张数,求最小的花费。我的做法是先二分找到范围i然后在[i +1, n]里面找打印的最小价钱,是否比i小.最小值用了RMQ.#include #include #include #include using namespace std;const int MAX =

2014-03-29 10:20:33 634

原创 ZOJ 1563 Pearls(DP)

题意:有不同质量的珍珠,且质量高的珍珠价钱比质量低的珍珠价钱高。买一类珍珠的价钱计算方式:(购买数量+10)×单价质量低的珍珠可以用质量高的珍珠替代.要求给出一列表要买的珍珠类型和数量,求买完所有珍珠所要的最低价钱.那么可以得到:要么在第i类里买完所有质量i要买的的珍珠,要么在i后面的类里面买,因为如果一部分在第i类里买,一部分在其他类里买,由于价格是递增的,那么价

2014-03-27 21:08:54 444

原创 ZOJ 1524 Supermarket

题意:给出一张要买的东西列表,一排货架,要求在列表上从上到下,在货架上从左到右的选购东西,如果列表上第i件物品在第j个货架上买了,那么第i+1个物品,必须在第j个货架后面买.求买完所有东西需要的最少价钱.设dp[i][j]为前i件物品在前j个货架上买需要的最少价钱.那么有dp[i][j] = min(dp[i - 1][j - 1] + price[j], dp[i][j - 1]).

2014-03-27 12:25:34 944

原创 ZOJ 3741 Eternal Reality

题意:要参加一个比赛,要想赢一场比赛,自身等级必须大于等于对手的等级,初始等级为L,比赛场数N.主人公可以吃药,吃了药之后等级临时变成L + 1持续X场,X场之后会变成0级并且持续Y场后又变回初始等级L.求最多能赢多少场.设dp[i][0]为在第i场吃药到最后最多能赢多少场,dp[i][1]为在第i场不吃药到最后最多能赢多少场.1)dp[i][0] = [i, X + Y - 1]的赢得场

2014-03-26 21:24:41 1091 2

原创 vijos 1071 新年趣事之打牌

01背包问题,要求能否填满整个背包,由于要求出那几张牌丢失,所以不能使用滚动数组..这种情况下把dp[0][0]置0,其他的置为无穷小,再进行普通的01背包.如果dp[N][TotalW] != TotalW那么说明没有解.再判断是否dp[i][TotalW- W[i]] + W[i] == TotalW,如果是那么就可以通过第i张牌和前面i - 1张牌中的某几张牌组成totalW,如

2014-03-25 18:19:36 711

原创 vijos 1121马拦过河卒

设dp[i][j]为从[0,0]到[i,j]的方案数,那么dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 这里i - 1 和j - 1必须在边界里并且[i - 1, j]和[i, j - 1]必须不能被马控制.用的是记忆化搜索.#include #include using namespace std;const int MAX = 20;bool r

2014-03-25 14:31:24 554

原创 ZOJ 2402 Lenny's Lucky Lotto Lists(简单DP)

题目大意:给出两个整数M,N 在1~M的范围里选出N个数,条件是第i个数必须大于等于第i-1个数的两倍, 求总共能选出的方案数.设dp[i][j]为1~i选择j个数出来的方案数,那么dp[k][j + 1] += dp[i][j] (2 * i#include #include using namespace std;const int MAX = 2001;long long

2014-03-25 14:28:47 502

原创 vijos 1038 添加括号

石子合并类似的问题,要求找出括号的添加方法,最小中间和之和,各个中间和.设dp[i][j]为i到j之间最小中间和之和则dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j] | ibase case:dp[i][i] = 0#include #include #include using namespace s

2014-03-23 21:32:23 928

原创 POJ 1179 Polygon(环形DP 矩阵连乘)

题意:给出一个环 环上的每个点有一个值 点和点之间用一条边相连,边上有一个运算符,要求删除一条边,然后对剩下的线两两顶点合并运算.求通过运算能得到的最大值.并求出删除某条边后能经过运算得到这个最大值的这些边.由于N要注意的是最大值可能有最小值相乘得到(负数),所以也要记录最小值.设dp1[i][j]为从i到j的最大运算结果,dp2为最小值那么dp1[i][j] = max(dp

2014-03-23 10:40:53 947

原创 vijos 1218 数字游戏(环形dp)

第一次接触环形的dp,学到了一招:把环复制一次就变成了线了,不过复杂度同样也要上一层.枚举每一个切割点k,对[k, k + n]序列做如下dp:设dp[i][j]为前i个数字分成j堆能得到最大/最小值.则dp[i][j] = max/min{dp[p][j - 1] * (sum(p + 1, i) % 10) | 1 base case:dp[i][1] = sum(1, i)

2014-03-22 20:07:47 1237

原创 HDU 2151 Worm

题目是中文,题意就不啰嗦了.设dp[i][j] 为第i分钟后到达第j颗树的方案数.dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1] 满足j - 1>= 0 && j + 1 初始化为dp为-1base case: dp[0][P] = 1#include #include using namespace std;const in

2014-03-19 09:04:48 463

原创 蓝桥杯练习系统 PREV-4 剪格子

搜索题.几处剪枝的地方:1.当前和s大于总的和减去s,没有必要继续搜下去.2.当前使用的格子大于等于最优解,没有必要继续搜下去.下面的程序可能会剪成3部分,可是还是过了,不知为什么.#include #include #include using namespace std;const int MAX = 11;bool vis[MAX][MAX];int n, m

2014-03-17 15:53:16 491

原创 HDU 2571 命运

题意:给出一个矩阵,要求从1,1走到n,m,每个格子里都有一定的幸运值,每次只能向下或向右走,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。求走到n,m能得到的最大幸运值.算一道简单的dp题吧.设dp[i][j]为走到i,j位置能得到的最大值.那么dp[i][j]=max(dp[i][j - 1], dp[i - 1][j],

2014-03-17 08:59:29 540

原创 蓝桥杯练习系统 ALGO-5 最短路

问题描述给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。输入格式第一行两个整数n, m。接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。输出格式共n-1行,第i行表示1号点到i+1号点的最短路。样例输入3 31 2 -12 3

2014-03-16 19:31:55 716

原创 蓝桥杯练习系统 ALGO-4 结点选择

问题描述有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?输入格式第一行包含一个整数 n 。接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。接下来一共 n-1 行,每行描述树上的一条边。输出格式输出一个整数,代表选出

2014-03-16 19:05:46 834

原创 蓝桥杯练习系统 ALGO-3 K好数

问题描述如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。输入格式输入包含两个正整数,K和L。输出格式输出一个整数,表示答案对1000000007取模

2014-03-16 18:50:53 477

原创 POJ 1157 LITTLE SHOP OF FLOWERS

题意:给出F朵花,V个花瓶,每朵花插入每个花瓶都有一个美观值,要求第i朵花所在的花瓶号小于第j朵花所在的花瓶号(i 设dp[i][j]为前i朵花插入到前j个花瓶能得到的最大美观值(i 则如果i == 1,dp[i][j] = max(dp[i][j - 1], val[i][j])否则如果j > V - F + i(i能插的地方只能在[i, V - F + i]号花瓶里,所以):d

2014-03-15 20:21:24 550

原创 POJ 1887 Testing the CATCHER

最长递减序列问题.#include #include #include using namespace std;const int MAX = 5000;int dp[MAX], g[MAX], A[MAX];int main(int argc, char const *argv[]){ int h, caseno = 1; while(scanf("%d", &h) &&

2014-03-15 17:04:10 319

原创 POJ 3356 AGTC(经典DP Edit Distance)

题意:给出2个字符串x, y,长度为n,m,允许使用3种操作,求把x变成y需要的最小步骤,也就是要求两个字符串的编辑距离.插入:在x的任意位置插入一个字符.删除:在x的任意位置删除一个字符.替换:在x的任意位置替换一个字符成任意字符.设dp[i][j]为x后缀[i:]变成y的后缀[j:]所需要的最小步骤([i:]代表从i位置开始一直到尾部的字符串)则:如果x[i] == y

2014-03-15 16:36:34 860

原创 POJ2192 | ZOJ 2401 Zipper

题意:给出3个字符串A,B,C 判断第3个字符串是否可以通过前2个串穿插变成.设dp[i][j]表示A的前i个字符串和B的前j个字符串是否能够构成C的前i + j个字符.则dp[i][j] = max(dp[i - 1][j] * (A[i - 1] == C[i + j - 1]), dp[i][j - 1] * (B[j - 1] == C[i + j - 1])).这里字符串索引从0

2014-03-15 14:16:05 453

原创 POJ 2250 Compromise(LCS问题)

最长公共子序列打印序列.用一个path数组记录路径.#include #include #include using namespace std;const int MAX = 101;short dp[MAX][MAX];short path[MAX][MAX];char pro1[MAX][31], pro2[MAX][31];void print_path(int

2014-03-14 16:38:47 385

原创 POJ 1958 Strange Towers of Hanoi

求4条柱子的汉诺塔问题所需要的移动次数.题目中已经给出了算法,实现就可以了.代码里把k值打表了.#include #include using namespace std;int ans = 0;const int Ok[13] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4};int memo[13];int tower_3(int

2014-03-14 15:58:06 540

原创 POJ 1953World Cup Noise

题意:给出一个数n,求n位二进制中有多少个数不包含相邻的1.普通的统计每一个数的话最大要统计2^45次,吃不消.可以用dp一位一位做.dp[i][0]表示长度位i的二进制当前位为0能有多少个数.dp[i][1]表示长度位i的二进制当前位为1能有多少个数.很容易可以得到方程:dp[i][0] = dp[i - 1][0] + dp[i - 1][1], dp[i][1] =

2014-03-13 22:05:42 1401

原创 ZOJ 2421 Recaman's Sequence

按照题目给出的递推公式生成序列就可以了,用数组来判重.#include using namespace std;const int MAX = 500001;bool vis[MAX * 7];int seq[MAX];void init(){ vis[0] = 1; int maxv = 0; for(int i = 1; i < MAX; ++i){ int r =

2014-03-13 21:44:17 378

原创 HDU1920 Jackpot

题意:求n个数字同时到0的周期.就是求最小公倍数.注意long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a : gcd(b, a % b);}int main(int argc, char const *argv[]){ int T;

2014-03-10 21:40:00 518

原创 HDU1905 Pseudoprime numbers

题意:给出p, a两个整数,判断p是否是以a为底的假素数,也就是要满足a^p=a(mod p).可以用快速幂取模求出a^p来做.#include using namespace std;bool is_prime(int n){ for(int i = 2; i * i <= n; ++i){ if(n % i == 0)return false; } return tru

2014-03-10 19:57:12 629

原创 HDU 1788 Chinese remainder theorem again

题目介绍了一大堆中国剩余定理的东西,其实没有用到.求N,满足N%Mi = Mi - a.也就是(N + a) % Mi = 0,那么只要求出Mi的最小公倍数再减一个a那么就是答案了.注意用long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a

2014-03-10 09:39:05 569

原创 HDU1614 | UVA 103 Stacking Boxes

数塔类型的dp,记忆化搜索就可以了.注意杭电的输出最后有一个空格.#include #include #include #include using namespace std;const int MAX = 31;struct Box{ int id, dims[11];}boxes[MAX];bool g[MAX][MAX];int dp[MAX], fa[MAX]

2014-03-10 09:01:29 728

原创 HDU1787 GCD Again(容斥原理)

和1695类似的题目,只不过这次求的是不互质数的个数.#include #include #include #include using namespace std;const int MAX = 1000005;bool is_prime[MAX];int prime[MAX / 10], prime_idx;void init_prime(){ memset(is_pr

2014-03-09 21:52:13 420

原创 HDU 4135 Co-prime

和1695题类似的题目,不过简单点.求区间[A,B]里和N互质的数的个数,那么可以通过容斥原理求出[1, r] 区间里和N互质的数的个数.容斥原理的方法和1695题的方法类似,这里给上链接1695.答案自然就是[1, B] - [1, A].#include #include #include using namespace std;const int MAX = 1000001;

2014-03-09 14:41:16 485

原创 HDU 1695 GCD(欧拉函数+容斥原理)

求[1..b]中的x和[1..d]中的y有多少gcd(x,y) = k.要求gcd(x,y) = k,则等价于求 gcd(x/k,y/k) = 1.所以问题转化成求[1..b/k]和[1..d/k]中有多少对gcd(x,y) = 1.进一步转换成 枚举[1,d]区间里的n与][1, b]的区间的数互质的个数,这里d>=b.因为[1,b]包含在[1,d]里,所以[1,b]相当于累加欧

2014-03-09 13:40:30 733

原创 HDU 1576 A/B

题意很清楚,给出n = A % 9973, B gcd(B, 9973)为1, 求(A/B)%9973.模运算有很多性质:(a+b) % c==(a % c + b % c)  %c , (a-b) % c==(a % c - b % c), (a*b) % c==(a % c * b % c),但是除法没有这个性质.不过可以通过求B的乘法逆元来求得.解法:(a / b) % c ==

2014-03-08 21:02:08 839

原创 UVA 11029 - Leading and Trailing

求n^k的前3位和后3位.后三位:通过快速幂取模求得.前三位:将n^k转换成10^(k*log10(n)),用fmod求得k*log10(n)的小数部分t, 10^(t)的整数部分就是第一位, 10^(2 + t)的整数部分自然就是前三位了.#include #include #include #include #include using namespace std;l

2014-03-08 12:17:19 526

原创 ZOJ 1005 - Jugs | UVA 571 - Jugs

广搜水过去了,状态很少.#include #include #include #include using namespace std;const int MAX = 10001001;const char * ins[] ={"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};struct Nod

2014-03-07 20:56:51 470

原创 UVA 10820 - Send a Table

求1-n之间互质的对数.首先打表求出欧拉函数的值,然后直接累加1-n的欧拉函数值*2就是答案,注意n=1的时候要特判下.#include using namespace std;const int MAX = 50001;int phi[MAX];int generate_phi(){ for(int i = 0; i < MAX; ++i)phi[i] = 0; phi[

2014-03-07 19:13:35 430

空空如也

空空如也

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

TA关注的人

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