随笔分类 -  DP

摘要:题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。 题目给出a,b,求出0~b有多少个不大于f(a)的数。思路: 数位DP,用来学习数位DP了。 所谓数位DP就是基于考虑数字的每一位来转移的DP。 例如求比456小的数,可以这么考虑, 4 5 6 4 5 (0~6) 4 (0~4) (0~9) (0~3)(0~9) (0~9) ... 阅读全文
posted @ 2013-11-20 12:47 Griselda. 阅读(2408) 评论(0) 推荐(1) 编辑
摘要:题意: 给出一个2*n的方格,当刷完某一个方格的漆后可以且只可以走到相邻的任何一格,即上 下 左 右 左上 左下 右上 右下。可以从任意一个格子开始刷墙,问有多少种刷法,因为随着n的增大方案数会变多,因此输出方案数mod 1000000007.思路: dp[][2], dp[i][0]表示2*i的格子从第i列开始刷,最后回到该格子下面 dp[i][1]表示2*i的格子从第i列开始刷,最后无法回到该格子下面 状态转移方程是:dp[i][0] = 2*dp[i-1][0] 即 A1->B1->...->B2->A2, A1->B2->...->B1-> 阅读全文
posted @ 2013-08-11 14:05 Griselda. 阅读(342) 评论(0) 推荐(0) 编辑
摘要:题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 int n, m; 9 int G[110], bir[1>2)&i) || ((i>1)&bir[j][0])) continue;48 dp[0][j][i] = bir[i][1]+bir[j][1];49 ans = max(ans, ... 阅读全文
posted @ 2013-07-19 17:43 Griselda. 阅读(242) 评论(0) 推荐(0) 编辑
摘要:题意: 知道一个人买票花的时间和和前面那个人一起买票花的时间,问最少花多少时间可以把票卖完.. 输入: 给出T,表示有T组样例 给出n,表示有n个人买票.. 给出n个数表示这个人单独买票会花的时间.. 给出n-1个数,表示这个人和前面那个人一起买票会花的时间.. 思路: 状态转移方程是:dp[i] = min(dp[i-1]+单独买花的时间, dp[i-2]+和前面那个人一起买花的时间) 初始状态是dp[1] = 第一个人单独买话的时间 Tips: nothing..??!Code: 1 #include <stdio.h> 2 #include ... 阅读全文
posted @ 2013-06-05 14:39 Griselda. 阅读(1184) 评论(0) 推荐(0) 编辑
摘要:题意: 给出n个石头的重量和得分,有一个为m的背包,问在m个背包里能装的最大得分是多少,并要求输出装入的石子编号.. 如果有多个解则输出字典序最小的..思路: 这个在背包九讲后面有提及.. 主要是用一个二维数组path[i][j]表示当体积为j的时候第i件物品是否有被装入.. 最后用一次循环根据if(path[i][tv]) { ans[cnt++] = i; tv -= v[i]; } 就可以求出路径并保存在ans里面了..Tips: 注意找的时候应该是从i = n往前遍历.. 而输出的时候应该... 阅读全文
posted @ 2013-04-17 21:32 Griselda. 阅读(254) 评论(0) 推荐(0) 编辑
摘要:题意:给出n张牌的重量和现在剩下的牌的重量。求缺失了的牌。如果无解就输出0 多解就输出-1 否则就按照输入的顺序输出排的编号思路: 01背包.. 状态转移用dp[v] = cnt;表示牌的总和为v的情况是为cnt 记录路径有path[v] = j; 表示是加上了第j个物品才得到体积为v的。 一开始有一个已知的是dp[0] = 1; 状态转移方程为 if(dp[j-w[i]])dp[j] += dp[j-w[i]]; 表示当前一个状态存在的情况下,这一个状态的情况数为前一个状态加上当前这个状态的情况数。 因为题目要求给出缺失的牌的编号,所以如果dp[j] == 0,即第一次遇到这个情... 阅读全文
posted @ 2013-03-16 21:08 Griselda. 阅读(350) 评论(0) 推荐(0) 编辑
摘要:题意: 给出每一秒降落的蚊子坐标~ 给你一个蚊拍.. 如果一下子拍死n只那就能得n*n的分~ 问最高能得多少分~ 输入: 一个t n 表示t秒n只蚊子 接下来t行每行给出n只蚊子的横纵坐标思路: 因为n<10 所以可以用状态DP来找~ dp[t][stat] 表示在第t次的stat状态下 eg:dp[2][4]表示在第二次4--> (0100)-->第3个位置有蚊子的状态下能够得到的分 先把所有情况都初始化为负无穷大.. 然后把dp[0][0~stat]都初始化0 因为落拍点的不同会导致拍到蚊子数的不同~ 即会存在偏移量~ 所以球拍落拍点... 阅读全文
posted @ 2013-02-11 13:21 Griselda. 阅读(278) 评论(0) 推荐(0) 编辑
摘要:题意:n个人说自己前面有多少人 后面有多少人求出说真话人数最多的情况每个样例有 一个 n 表示n个人接下来 n 行有a b 表示他前面的人数和后面的人数思路:如果已经知道了其中一组的人数~就往前找..找在这一组之前与这一组的话不矛盾的最多人数Tips:用dp[ i ][ j ] 表示从第 i+1 个人到第 j 个人为一组的时候前j个人中说真话最多的人用tt[ i ][ j ] 表示从第 i 个人到第 j 个人之间站了多少人用an[ i ]表示到第 i 个人前面说真话的人最多人数tt[ a ][ b ]的人数不应该多于n-(b-a+1)Code:View Code 1 #include < 阅读全文
posted @ 2012-09-18 23:54 Griselda. 阅读(518) 评论(0) 推荐(1) 编辑
摘要:题意:已知s.b原来有多少钱 in以及知道 m 个去他想去的城市工作需要用多少钱以及能挣到多少钱 然后知道他从 a 城市到 b 城市得花多少钱.. 问他能不能去完他想去的城市??给出一个 T 表示样例个数接下来每个样例给出一个 n m in表示有 n 个点 m 个想去的地方接下来 m 行..每行给出 a b w 代表 a 城市和 b 城市之间路费为 w然后有一个 h 表示他想去的城市个数接下来 h 行..给出 a c d 代表在a城市需要花d元 能够挣 c 元思路:状态压缩DP..求出城市间最短距离初始状态是如果从第一个城市到第 i 个城市的路费+花费 >= 0 就让这个dp[ 1< 阅读全文
posted @ 2012-09-16 06:32 Griselda. 阅读(169) 评论(0) 推荐(0) 编辑
摘要:题意:给出字符串个数 n给出n串字符串找出上下两个字符串重复和最多的个数..eg:5 abc bcd cde aaa bfcde 0根据aaa abc bcd cde bfcde答案就是重复的 a bc cd cde思路:因为状态很少..最多只有10 个字符串~而每个字符串最多 10 个字符..所以可以用状态DP来实现..dp[ sta ][ i ] 表示 在sta 状态下以第 i 串字符串结尾的最优解.. sta 用 (1<<n)-1 表示..其中变成二进制后1表示有这个状态 0 表示没有这个状态..基本算法:①. 根据给出的 n 确定 sta②. 根据给出的数据确定辅助数组 f 阅读全文
posted @ 2012-09-07 21:42 Griselda. 阅读(296) 评论(1) 推荐(1) 编辑
摘要:前几天刚学了dp..wa了几次才ac了那道题..是学校oj上的1004..上网查资料时看到了从上到下和从下到上两种方法..今天发现了一道类似的题..<1038>鉴于上次是从上到下..这回就写了个从下到上的~很lucky的一次就ac了~郁闷了一早上的心情也好了~所以我兴高采烈地在这里写一个类解题报告..以此记念我的第一次独立成功ac一道dp题~虽然它很基础..绪论..dp是动态规划..百度百科上的解释是:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法。用我的理解就是先解决当前小问题..从而解决大问题..基本要素是:①.最优子结构 阅读全文
posted @ 2012-02-05 17:03 Griselda. 阅读(175) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示