UVa 11584 - Partitioning by Palindromes(DP)
给出一个字符串,判断他最少划分成几个回文串。
枚举字符串终点,转移方程为 d [ i ] = m i n ( d [ i ] , d [ j − 1 ] + 1 ) 。
1 |
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
给出一个字符串,判断他最少划分成几个回文串。
枚举字符串终点,转移方程为 d [ i ] = m i n ( d [ i ] , d [ j − 1 ] + 1 ) 。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
给出 n 种灯泡,同时给出他们的电压 v 、电源价格 k 、灯泡单价 c 和需求数量 l 。电压低的灯泡可以被电压高的代替,问最小花费。
按照电压从低到高排序,状态 d [ i ] 表示前 i 种的最小花费,转移方程为 d [ i ] = m i n ( d [ i ] , d [ j ] + ( s [ i ] − s [ j ] ) ∗ a [ i ] . c + a [ i ] . k ) ,其中 s [ i ] 表示前 i 种灯泡所需数量和。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
最大相对差问题。维护区间最大值计算。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
数论问题, n 个人围成环,每点 m 个就删掉点到的那个,问最后剩下人的编号。
递推公式为 f [ i ] = ( f [ i − 1 ] + m ) 。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
都是些卡特兰数的简单应用,组合数学上有所介绍。
卡特兰数公式
C n = ( 2 n n ) − ( 2 n n + 1 ) = 1 n + 1 ( 2 n n ) for n ≥ 0
卡特兰数会用到大数,题目代码中的大数部分就不贴了,最后会贴个大数模板。
前几道题并没有什么难度,看组合数学就可以,最后一道用到了快速求组合数。
HDU 2067:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=13389
输出从 n ∗ n 正方形左下顶点走到右上顶点的不穿越副对角线的路径数目。
就是卡特兰数可以从上方的三角形走,也可以从下方的三角形走,所以是卡特兰数 C n ∗ 2 。
1 | #include<iostream> |
HDU 1134:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=31502
1 | BigNum h[110]; |
HDU 1133:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18982
1 | BigNum k[210]; |
HDU 1130:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=23152
1 | BigNum h[110]; |
HDU 1131:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=31500
1 | BigNum h[110],k[110]; |
HDU 1023:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18469
1 | BigNum h[110]; |
HDU 1267:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=38281
1 | #include<iostream> |
HDU 3398:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=14690
类似于卡特兰数,推出公式为
a n s = ( n + m n ) − ( n + m n + 1 ) , ( n , m ≤ 1000000 )
。
由于 n , m 很大不能使用一般的方法求出组合数,使用唯一分解,然后用快速幂求出所求组合数。
1 | #include<iostream> |
大数模板:
1 | #define MAXN 9999 |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
HDU 1425:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21604
排序输出前几个数,没什么难度。
1 | #include<cstdio> |
HDU 1800:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21605
输入可能带有前导0的 n 个数,输出数量最多的数。数据范围很大,用Hash表做。然而直接用int读入用map做也可以通过。
1 | #include<cstdio> |
HDU 1496:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18464
给出方程 a ∗ x 1 2 + b ∗ x 2 2 + c ∗ x 3 2 + d ∗ x 4 2 = 0 ,解的范围是[-100,100]。
方程中都是 x 2 ,所以在[0,100]内,进行折半搜索,求得的答案每个变量都有2种可能,所以最后乘16。
1 | #include<cstdio> |
HDU 1228:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21606
给出英文等式求和,很早之前ACM协会练过这道题,没有难度。
1 | #include<iostream> |
HDU 1043:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=17579
给出八数码初始状态,输出到标准状态的移动方法,多组输入。类似于紫书上的八数码问题,但是是多组输入,固定终止状态,所以进行BFS时要反向进行,然后对每次输入的 状态直接打印路径。
对于状态判重,紫书上的编码方式被称为康托展开,使用 n ! 对状态编码。
1 | const int fact[]={1,1,2,6,24,120,720,5040,40320,362880}; |
再利用数组记录当前状态当下一个状态的走法和下个状态的编号。打印路径时遍历链表不需要进行BFS。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
这次背包专题的题目大都是一些模板题,前四题套用模板就可以通过,最后一题题是二维费用背包,但也很基础。
HDU 2602:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=17434
01背包。
1 | #include<cstdio> |
HDU 1114:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=17679
完全背包。
1 | #include<cstdio> |
HDU 2191:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20468
多重背包。
1 | #include<cstdio> |
HDU 4508:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=37528
完全背包。
1 | #include<cstdio> |
HDU 2159:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20469
二维费用背包,费用分别为杀的怪的数量和疲劳值,状态转移方程为 d [ j ] [ l ] = m a x ( d [ j ] [ l ] , d [ j − 1 ] [ l − c [ i ] ] + v [ i ] ) 。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
HDU 1846:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=11241
给出 n 个物品,两个人轮流取,每次取1~ m 个,不能取的人负,输出胜利者。
巴什博弈,当 n % ( m + 1 ) = 0 时后手胜利,否则先手胜利。
1 | #include<cstdio> |
HDU 1847:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20980
给出 n 个物品,两个人轮流取,每次只能取2的倍数个。
巴什博弈,第一个先手的人只要能构造出3的倍数就可以必胜。对三取余判断输出结果。
1 | #include<cstdio> |
HDU 1848:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=22378
给出三堆牌,每次去的个数只能是菲波那契数,问谁能赢。
看了解题报告才知道这是运用SG函数的尼姆博弈,去现学的,对每个输入的值求SG函数值,然后进行异或求解。
1 | #include<cstdio> |
HDU 1849:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=10636
可以抽象成给出 n 堆牌,每次可以取一张或者全取走,问谁胜。
比上一题简单的尼姆博弈,对输入的数进行异或输出。
1 | #include<cstdio> |
HDU 1850:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=22381
给出多堆牌,每次可以任选一堆取走任意数量,问先手第一步有多少必胜取法。
首先异或判断是否存在必胜策略求的异或后的值为 a n s 。判断当前堆中有没有足够的牌,使得取走之后 a n s = 0 ,若有则方案数加一。
1 | #include<cstdio> |
HDU 2149:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=10637
输入土地成本 m 和每次加价最大值 n ,当出价高于或等于成本时得到该土地,输出先手必胜策略。
巴什博弈,首先判断是否存在必胜策略,然后枚举输出可行出价。
1 | #include<cstdio> |
HDU 2188:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26664
巴什博弈,和第一道题一样。
1 | #include<cstdio> |
HDU 2147:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26673
给出目标点的坐标,从原点出发,每次可以向左、向下或者向左下,问谁能赢。
当横纵坐标存在偶数时,先手赢。
1 | #include<cstdio> |
HDU 1079:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=11243
改变月份或移到后一天会改变月份与日期和的奇偶性,除了两个特殊日期9月30日和11月30日。对特殊日期进行特判,其他情况只要判断奇偶性就可以知道。
这题还可以用SG函数做。
1 | #include<cstdio> |
HDU 1517:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=13014
看了题解才会的,类似于巴什博弈,每一段必胜区间都紧跟着一段必败区间,必胜区间对 n 不断除18之后的余数小于9。
这道题也可以用SG函数做。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
HDU 2199:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20576
输入一个 y ,求使得 8 ∗ x 4 + 7 ∗ x 3 + 2 ∗ x 2 + 3 ∗ x + 6 = y 的 x 的值, 0 ≤ x ≤ 100 。二分查找答案。
1 | #include<cstdio> |
HDU 2899:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20577
给出函数 F ( x ) = 6 ∗ x 7 + 8 ∗ x 6 + 7 ∗ x 3 + 5 ∗ x 2 − y ∗ x ,输入 y ,求函数最小值。
首先对该函数求导,然后二分查找使导函数为0的值 x 0 ,输出 F ( x 0 ) 。
1 | #include<cstdio> |
HDU 1969:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=23123
给出 n 、 m ,有 n 个蛋糕, m + 1 个人,每个蛋糕都可以切开,求每人分一整块蛋糕的最大值。求出蛋糕大小总和,然后进行二分查找,对二分的值进行验证。
1 | #include<cstdio> |
HDU 1905:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=40853
输入 p 、 a ,如果 p 不为素数且 a p % p = = a 输出yes,否则输出no。
2 < p ≤ 1000000000 , 1 < a < p
首先打出0~ p ‾ ‾ √ 的素数表,然后对每个 p 进行素性测试,再用快速幂求 a p % p 判断输出。
1 | #include<cstdio> |
HDU 2648:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18590
给出多个店的价格和每周上涨的价格,输出每周memory这家店的价格排名。
1 | #include<iostream> |
HDU 2446:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=11791
一开始枚举前缀和再进行二分查找。结果内存超限了。
不会优化,看了结题报告才知道可以用公式做。
http://blog.csdn.net/zxy_snow/article/details/6721066
公式: ( n 3 − n ) 6
1 | //原来的代码: |
HDU 2141:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18481
给出 a 、 b 、 c 三个数组,然后输入 s ,输出是否存在 a i 、 b j 、 c k 使得 a i + b j + c k = s 。
对两个数组进行预处理,然后在另一个中枚举,在预处理后的数组中二分查找。
1 | #include<cstdio> |
HDU 2298:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19904
给出物体下落点的坐标和发射初始速度,求角度。物理题推公式求根。
1 | #include<cstdio> |
HDU 2289:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=15721
给出一个圆台容器,给出水的体积,求水在圆台容器中的体积。
利用圆台体积公式,二分高度,输出。
1 | #include<cstdio> |
HDU 1010:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16336
给出一个地图,问能不能在 t 步之内从起点走到终点,不能重复走过同一个格子。
因为是恰好走到,所以是DFS的题,而不是BFS。
要进行剪枝,否则会超时。首先进行奇偶性剪枝,起点终点间的距离要和 t 的奇偶性相同,然后再查找的过程中如果当前点到终点的距离小于剩余时间就回溯。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **
HDU 1213:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19354
给出人数和人的关系,认识的人可以在一桌,求最少要分几桌。简单并查集的应用。
1 | #include<cstdio> |
HDU 1272:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=11138
给出一个图中结点的关系,问是否是一个树。
判断只有一个连通分支,且边数 m = n − 1 。
1 | #include<cstdio> |
HDU 1325:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=27465
与上题类似,是要判断是否为有向树。
在上题基础上还要满足每个结点的入度之多为1。
1 | #include<cstdio> |
HDU 1856:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=11137
给出 n 个人物关系,问最多能挑选出的有着直接或间接朋友关系的集合的人的数量。并查集初始化每个人的权值为一,求最大权值的集合。
1 | #include<cstdio> |
HDU 1102:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=18449
给出 n 个点之间任意两点建立通路的费用,再给出 m 条建好的路,求最小生成树(MST)。
1 | #include<cstdio> |
HDU 1232:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19355
有 n 个结点, m 条边,求使所有结点连通还要建立至少几条边。
1 | #include<cstdio> |
HDU 1233:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=20289
给出n个结点和每个结点间的距离,求使所有结点连通的边的长度和最小值。
1 | #include<cstdio> |
HDU 1875:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=15740
给出结点的坐标,求使所有结点连通的边的最小花费和。当距离 d < 10 或 d > 1000 时不能建立边。
1 | #include<cstdio> |
HDU 1879:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=23262
给出结点、建造边的花费、部分已经建好的边,求使所有结点连通的最小花费。
1 | #include<cstdio> |
HDU 1811:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19357
给出一些人之间的偏序关系,问能否组成一张排名表。
首先用并查集储存相等的人,然后进行拓扑排序。如果出现一个以上的人不存在比自己大的人则为“UNCERTAIN”,如果形成环那么输出“CONFLICT”。
1 | #include<cstdio> |
HDU 1829:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16380
给出虫子的交配关系,问有没有同性恋的虫子。
用并查集合并,同时记录每个虫子所在的层数,出现相同层数的虫子交配即为同性恋。
1 | #include<cstdio> |
HDU 1198:
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16425
给出11种管道,再给出地图,问有几个连通分支。
貌似可以用并查集做,但是DFS时间也够,而且感觉DFS更加直观。
1 | #include<cstdio> |
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **