
-动态规划
文章平均质量分 81
virgoDd
Good afternoon,good evening and good night
展开
-
HDU 2089 不要62(数位DP·记忆化搜索)
题意 中文最基础的数位DP 这题好像也可以直接暴力来做 令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么很容易有状态转移方程dp[i][j] = sum{ dp[i-1][k] }, k = 0...9, j != 4 && !( j == 6 && k == 2) 最后统计个数就行了#include using namespace std;i原创 2015-07-22 15:50:37 · 816 阅读 · 0 评论 -
HDU 2159 FATE(二维完全背包)
中文题目就不用解释了 就是裸的二维完全背包d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验 然后就用完全背包来做了 二维背包背包不过是多了一重循环#include#include#includeusing namespace std;const int N = 105;int main(){ //还需的经验值n,保留的忍耐度m,怪的种数k,最多的杀怪数s原创 2014-09-02 09:51:13 · 544 阅读 · 0 评论 -
HDU 1058 Humble Numbers(DP,数)
题意 所有只能被2,3,5,7这4个素数整除的数称为Humble Number 输入n 输出第n个Humble Number1是第一个humble number 对于一个Humble Number a 有2*a,3*a,5*a,7*a都是Humble Number 可以以1为基数 依次展开即可得到一定范围内的Humble Number 用i,j,k,l分别记录 2,3,5,原创 2014-09-02 09:51:30 · 575 阅读 · 0 评论 -
HDU 1501 Zipper(DP,DFS)
题意 判断能否由字符串a,b中的字符不改变各自的相对顺序组合得到字符串c本题有两种解法 DP或者DFS考虑DP 令d[i][j]表示能否有a的前i个字符和b的前j个字符组合得到c的前i+j个字符 值为0或者1 那么有d[i][j]=(d[i-1][j]&&a[i]==c[i+j])||(d[i][j-1]&&b[i]==c[i+j]) a,b的下标都是从1开始的 注意0的初原创 2014-09-02 09:52:00 · 584 阅读 · 0 评论 -
HDU 1789 Doing Homework again(贪心)
题意 某大参加ACM竞赛回来落下很多作业 每个作业都有最后期限 没在最后期限之内做完期末就要扣掉对应的分 求最少扣多少分把所有作业按扣分大小从大到小排序 然后就贪阿 能完成前面的就完成前面的 实在不能的就扣分吧~#include#include#includeusing namespace std;const int N = 1005;int dli[N], r原创 2014-09-02 09:51:47 · 562 阅读 · 0 评论 -
POJ 3356 AGTC(最长公共子序列)
AGTCDescriptionLet x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below:Deletion: a letter in x is missing in y at原创 2014-09-02 09:51:05 · 545 阅读 · 0 评论 -
HDU 2602 Bone Collector(01背包)
Bone CollectorProblem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also h原创 2014-09-02 09:51:07 · 509 阅读 · 0 评论 -
HDU 2845 Beans(DP,最大不连续和)
题意 吃豆子游戏 当你吃了一个格子的豆子 该格子左右两个和上下两行就不能吃了 输入每个格子的豆子数 求你最多能吃多少颗豆子可以先求出每行你最多可以吃多少颗豆子 然后每行就压缩成只有一个格子了 里面的豆子数就是那一行最多可以吃的豆子数 然后问题就变成求一列最多可以吃多少颗豆子了 和处理每一行一样处理 那么问题就简化成求一行数字的最大不连续和问题了原创 2014-09-02 09:51:28 · 546 阅读 · 0 评论 -
HDU 1114 Piggy-Bank(完全背包 DP)
题意 知道空存钱罐的重量和装满钱的存钱罐的重量及每种币值的重量 求存钱罐里至少有多少钱 裸的完全背包 但是是求最小值 所以初始0要变成初始INF max也要变成min#include#include#includeusing namespace std;const int N = 10005, INF = 0x3f3f3f3f;int val[N], wei[N]原创 2014-09-02 09:51:51 · 591 阅读 · 0 评论 -
HDU 1078 FatMouse and Cheese(DP)
题意 老鼠在一个小镇吃奶酪 城镇可以看成一个n*n的矩阵 其中每个格子都有一定数量的奶酪mat[i][j] 老鼠从(0,0) 开始吃 而且下个吃的格子里的奶酪必须比上个格子多 老鼠只能水平方向或者垂直方向走 而且每次走的距离不能超过k 求老鼠最多能吃多少奶酪起点是固定的 比较容易 直接记忆化搜索令d[i][j]表示以(i,j)为终点的最优解 那么对于所有(i原创 2014-09-02 09:51:55 · 679 阅读 · 0 评论 -
HDU 1300 Pearls(DP)
题意 珠宝店到珍珠批发商进货 第i种价格为p[i]的珍珠需要n个 则珍珠的结算价格为∑(n+10)*p[i] 由于没种珍珠的数量结算时都要加上10 所以有时候把便宜的珍珠换为贵的结算价格反而变少了 给你一张购买清单 珍珠价格是递增的 每种珍珠都可以替换为比它贵的 求最少总花费简单dp 令d[i]表示前i种珍珠的最少花费 sum[i]表示第1种到第第i种的总数原创 2014-09-02 09:52:02 · 615 阅读 · 0 评论 -
HDU 2830 Matrix Swapping II (DP,最大全1矩阵)
题意 给你一个n*m矩阵 每列都可以随便交换位置 求最优交换后最大的全1子矩阵又是HDU 1505 1506的变种 但这个更容易了 因为每列都可以交换位置了 那么这一行中所有比i高的都可以与i相邻了 只需要统计这一行有多少个比i高就行了 可以在算出每一行后 把高度大的放前面去 用num[i]记录排序后的列原来的数 这样就有j列比h[i][num[j]]高了 最后的原创 2014-09-02 09:51:20 · 567 阅读 · 0 评论 -
HDU 2844 Coins (组合背包)
题意 给你n种面额不同的金币和每种金币的个数 求这些金币能组合成的面额在m内有多少种还是明显的背包问题 d[i]表示这些金币在i内能组合成的最大面额 初始化d为负无穷 d[0]=0 这样就可以保证d[i]恰好为i时才能为正值原因可以自己想想 然后就用背包背吧 直接多重背包也可以过 但是分成多重背包和完全背包要快一点#include#include#include原创 2014-09-02 09:51:26 · 551 阅读 · 0 评论 -
HDU 1978 How many ways(DP)
题意 中文 但要注意小于你能量的点也是能到达的令d[i][j]表示到达第i行第j列的方法数 初始化为0 d[1][1]为1 输入一个点的能量t后 枚举这个点能到的所有点(i+x,j+y)(x+y#include#includeusing namespace std;const int N = 105, MOD = 10000;int main(){ int d原创 2014-09-02 09:51:34 · 554 阅读 · 0 评论 -
HDU 2059 龟兔赛跑(DP)
题意 中文简单的多阶段决策DP 令p[0]=0 p[n]=l d[i]表示乌龟从起点到第i个加油站所需的最小时间 那么有d[i]=min(d[i],d[j]+t(j,i)) t(j,i)表示 在第j个加油站加满油 然后直接开到第i个加油站 当然第0个加油站是起点就不用加油了 这样推到最后d[n]就是乌龟所需的最小时间了#include#include#原创 2014-09-02 09:52:06 · 665 阅读 · 0 评论 -
HDU 1171 Big Event in HDU(多重背包)
Big Event in HDUProblem DescriptionNowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Comput原创 2014-09-02 09:51:16 · 547 阅读 · 0 评论 -
POJ 1692 Crossed Matchings(DP)
题意 有两行数a[n1] b[n2] 分别有n1 n2个数 当第一行一个数和第二行一个数相等时 他们就可以连起来 每个数只能连一个 求最有多少条线使得每条都至少有一条和它相交令d[i][j]表示 a的前i个数和j的前j个数最多可以连接多少条当a[i]==b[j]时 将们连起来是肯定不与其它线相交的 所以d[i][j]=max(d[i-1][j],d[i][j-1原创 2014-09-02 09:51:49 · 619 阅读 · 0 评论 -
POJ 3934 Queue(DP)
QueueDescriptionLinda is a teacher in ACM kindergarten. She is in charge of n kids. Because the dinning hall is a little bit far away from the classroom, those n kids have to walk in line to t原创 2014-09-02 09:51:03 · 490 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!(DP)
Super Jumping! Jumping! Jumping!Problem DescriptionNowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little ab原创 2014-09-02 09:51:09 · 522 阅读 · 0 评论 -
HDU 1024 Max Sum Plus Plus (DP·滚动数组)
题意 从n个数的数组中选出不相交的m段 求被选数的和的最大值Max Sum 的升级版 不只是要选一段连续的了 而是选m段 思想还是类似 依旧dp状态和状态转移方程不是很难想 在 Max Sum 这个问题中 dp[i] 表示的是以第i个数结尾的一段的 Max Sum 由于这里还有一个多少段的状态 于是这里令 dp[i][j] 表示在前 i 个数中选取 j 组 且第 i 个原创 2015-08-27 10:02:55 · 1021 阅读 · 0 评论 -
HDU 1074 Doing Homework(DP·状态压缩)
题意 有n个作业要做 给你每个作业的最后期限 和做完这个作业需要的时间 作业每超过最后期限一天就会扣一分 只能把一个作业做完了再做另一个作业 问做完所有作业至少扣多少分作业最多只有15个 看到这个数字容易想到是状态压缩 dp[i]表示i对应状态的最小扣分 i转换为二进制后为1的位表明该位对应的作业已经做了 为0的位没做 那么dp[i] = min{dp[k] + c原创 2015-08-28 14:47:03 · 2065 阅读 · 0 评论 -
HDU 1069 Monkey and Banana(DP 长方体堆放问题)
Monkey and BananaProblem DescriptionA group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, prov原创 2014-09-02 09:51:18 · 719 阅读 · 0 评论 -
HDU 1505 City Game(DP)
City GameTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4531 Accepted Submission(s): 1919Problem DescriptionBob is a strat原创 2014-09-02 09:50:40 · 508 阅读 · 0 评论 -
HDU 1160 FatMouse's Speed(DP)
题意 输入n个老鼠的体重和速度 从里面找出最长的序列 是的重量递增时速度递减简单的DP 令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度 对与每个老鼠i 遍历所有老鼠j 当(w[i] > w[j]) && (s[i] #include#includeusing namespace std;const int M=1005;int w[M], s[M],原创 2014-09-02 09:51:53 · 570 阅读 · 0 评论 -
ZOJ 3450 Doraemon's Railgun (DP·分组背包)
题意 多啦A梦有一个超电磁炮 然后要打死n堆敌人 在同一条射线上的敌人只有先打死前面的一堆才能打后面的一堆 给你打死某堆敌人需要的时间和这堆敌人的人数 问你在T0时间内最多打死多少个敌人分组背包问题 先要把同一条射线上的敌人放到一个分组里 后面的敌人的时间和人数都要加上前面所有的 因为只有前面的都打完了才能打后面的 然后每组最多只能选择一个 判断共线用向量处理原创 2015-07-29 09:31:22 · 970 阅读 · 2 评论 -
ZOJ 3699 Dakar Rally(贪心)
题意 路上有 n 个加油站 每个加油站的价格可能不同 你的油箱容积为 v 问从起点开车到终点加油至少用多少钱贪心 每次都让油箱里面便宜的油最多就行了 在每个站点 i 有两种情况1. i 点把油加满跑完都没有更便宜的 那么在 i 点肯定要加满 然后开到 i+1 点去2. i 点把油加满能跑到第一个比 i 点更便宜的 j 点或者到了终点 j 那么只用把油加到能到原创 2015-07-08 08:36:18 · 1529 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram(DP·单调栈)
Largest Rectangle in a HistogramTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11137 Accepted Submission(s): 3047Problem Descrip原创 2014-09-02 09:50:42 · 731 阅读 · 0 评论 -
Codeforces 534B Covered Path(贪心)
题意 你在路上走 每秒钟的开始都可以改变自己的速度(改变速度都是瞬间完成的) 知道你开始的速度v1 结束时的速度v2 整个过程所用时间t 以及每秒最多改变的速度d 求这段时间内你最多走了多远最优的肯定是先把速度从v1升到最大 然后从最大减到v2 使得用的时间不会超多t 因为肯定是足够从v1减为或升到v2的 那么我们只用从两端往中间靠 哪边的速度小 哪边就加上d 知道原创 2015-04-13 17:29:27 · 893 阅读 · 0 评论 -
UVa 12563 Jin Ge Jin Qu hao(01背包)
题意 你在KTV还剩t秒钟的时间 你需要在n首歌中选择尽量多的歌使得歌的数量最多的前提下剩下的时间最小至少要留一秒给劲歌金曲 所以是一个容量为t-1的01背包 d[i][j]表示恰用j秒时间在前i首歌中最多唱多少首 每个状态有两种选择 唱或不唱第i首歌所以有转移方程d[i][j]=max(d[i-1][j],d[i-1][j-c[i]]+1)#include using原创 2015-02-07 13:54:46 · 2066 阅读 · 0 评论 -
UVa 116 Unidirectional TSP(DP)
题意 一个n*m的环形矩阵(第一行和最后一行是相邻的) 从第一列任意位置出发 只能往右上,右,右下3个方向走 求走到第m列经过的的最小数字和基础DP 横着的数塔问题#include #define l(x) d[x][j+1]using namespace std;const int N = 105;int n, m, g[N][N], d[N][N], fol[N][N原创 2015-02-06 22:03:36 · 945 阅读 · 0 评论 -
UVa 1347 Tour(DP)
题意 二维坐标系上有n个点 从第一个点出发经过部分点到达第n个点 再从第n个点回到第一个点 除了第一个点 每个点都经过且仅经过一次 求最短路径长度还是基础的DP 想出状态转移方程就容易了 d[i][j]表示去的时候经过第i个点回来经过第j个点且1~max(i,j)间的点都已经走过 显然d[i][j]=d[j][i] 所以只用考虑i>j的部分 i 第i+1个点要么去的原创 2015-02-06 20:12:54 · 857 阅读 · 0 评论 -
UVa 1025 A Spy in the Metro(DP)
题意 某城市的地铁有n个车站 编号1到n 有m1辆车向右开 给出m1个从车站1出发的时间 m2辆车向左开 给出m2个从车站n出发的时间 t[i]为火车从第i个车站开到第i+1(或相反)个车站需要的时间 Maria在车站1 她需要恰在时刻T到达第n个车站 求她的最小总车站等待时间基础的多阶段决策DP 令d[i][j]表示时刻j在i号车站剩下的最小总等待时间 每种状态有3种选择原创 2015-02-06 16:08:26 · 1948 阅读 · 0 评论 -
UVa 11134 Fabled Rooks(贪心)
题意 在n*n的棋盘上的n个指定区间上各放1个'车’ 使他们相互不攻击 输出一种可能的方法行和列可以分开看 就变成了n个区间上选n个点的贪心问题 看行列是否都有解就行 基础的贪心问题 对每个点k选择包含它的最优未使用区间 由于在给k找最优区间时1~k-1的最优区间都已经找好了 所有右界最小的区间肯定是最优区间原创 2015-02-02 17:19:47 · 1775 阅读 · 0 评论 -
HDU 5087 Revenge of LIS II(次长上升子序列)
题意 求一个序列的所有上升子序列中第二长的那个的长度简单的dp d[i]表示以第i个数结尾的最长上升子序列的长度 c[i]表示到达d[i]的方法数 如序列1 1 2 d[3]=2,c[3]=2 因为选1 3位置和 2 3位置的都可以得到d[3]=2 递推过程很简单 d[i]=max{d[j]+1}其中a[i]>a[j]&&i>j 最后看d[1~n]中最大的数出现了几次 出现原创 2014-11-01 22:06:30 · 1588 阅读 · 0 评论 -
HDU 2870 Largest Submatrix(DP)
题意 求最大相同字符子矩阵 其中一些字符可以转换其实就是HDU1505 1506的加强版 但是分了a,b,c三种情况 看哪次得到的面积最大对于某一个情况 可以把该字符和可以转换为该字符的位置赋值0 其它位置赋值1 这样就转化成了求最大全0矩阵的问题了对于转换后矩阵中的每个点 看他向上有多少个连续0 把这个值存在h数组中 再用l数组和r数组记录h连续大于等于该位置的最左边位置和原创 2014-09-02 09:51:22 · 545 阅读 · 0 评论 -
HDU 1421 搬寝室(DP)
题意 中文先把物品重量从小到大排序 d[i][j]表示前i件物品选j对的最小疲劳 若选了第i个物品 那么和它一对的必是第i-1个物品 注意是前i件i=j*2时 没有选择 d[i][j]=d[i-2][j-1]+(w[i]-w[i-1])^2i>j*2时 存在第i个选或者不选之分若选了第i个的话 那么问题就转化为在i-2个物品中选j-1个了若不选第i个的话原创 2014-09-02 09:51:24 · 698 阅读 · 0 评论 -
POJ 1205 Water Treatment Plants(递推)
题意 建设一条河岸的污水处理系统 河岸有n个城市 每个城市都可以自己处理污水 V 也可以把污水传到相邻的城市处理 >或令d[i]表示有i个城市时的处理方法数 最后一个城市的处理方法有1.V 自己处理自己的 与前i-1个城市的处理方法无关 有d[i-1]种方法2.3.>V 左边有污水传过来 和自己的一起处理 这时第i-1个城市可以向右传了 如果这种情况发生的原创 2014-09-02 09:51:36 · 756 阅读 · 0 评论 -
HDU 1300 Pearls(DP 珠宝店进货问题)
题意 珠宝店到珍珠批发商进货 第i种价格为p[i]的珍珠需要n个 则珍珠的结算价格为∑(n+10)*p[i] 由于没种珍珠的数量结算时都要加上10 所以有时候把便宜的珍珠换为贵的结算价格反而变少了 给你一张购买清单 珍珠价格是递增的 每种珍珠都可以替换为比它贵的 求最少总花费和上篇博客描述的几乎是一样的 令d[i]表示前i种珍珠的最少花费 sum[i]表原创 2014-08-23 16:19:24 · 1020 阅读 · 0 评论 -
UVa 10130 SuperSale(DP 01背包)
题意 商畅做活动买东西 每个人每个商品只能拿一件 要拿价值尽量高的商品 很简单的01背包题目 求出每个人可以拿的最大值 加起来就是结果了原创 2014-08-22 23:14:43 · 783 阅读 · 0 评论 -
UVa 10066 Twin Towers (DP 最长公共子序列)
题意 求两串数字最长公共子序列的长度裸的lcs没啥说的#include #include #include using namespace std; const int maxn=105; int a[maxn],b[maxn],d[maxn][maxn],na,nb; void lcs() { memset(d,0,sizeof(d));原创 2014-08-22 15:50:08 · 1199 阅读 · 0 评论