动态归划
jiangjiashi
这个作者很懒,什么都没留下…
展开
-
(树形DP)tree of tree (zju)
题意,一棵树中有N个结点(最多为100个结点)。每个结点有一个树值求该树的子树结点最多为K个的所有权值和最大是多少。思路:用dp[cur][K]记录包含当前结点与其子树所形成的子树的最大值。#include#include#include#include#include#include#include#includeusing namespace s原创 2014-12-17 10:26:29 · 746 阅读 · 0 评论 -
Travelling (HDU 3001)
一开始看成了一个城市最多只旅行一次,还以为是简单题,所以直接DFS,可是一直不对。后来仔细看,是至少旅行两次,这样用DFS就没法了。后来查了才知道是TSP问题,用的是DP,其实我也不太会写,先是看了一下别人的原理,代码,自己也是边写边模仿的吧。,就这样了#include#include#include#includeusing原创 2013-09-23 13:14:11 · 762 阅读 · 0 评论 -
(单调队列优化) 最小花费 (CD1690)
题意: 给出一排的山,每一个山的高度不同,不过可以用魔法把一座山的高度改变。 其花费为改变高度的平方。 相邻两座山的花费为A*D,A为系数,D为高度差。 求最小花费。 思路:当然用DP,不过只是单纯的DP会严重的超时,这时就要用到单调队列的优化。 因为dp[i][j]=min(dp[i-1][x] + a*abs(j-x) + (j-h[i])*(j-原创 2013-07-03 15:34:01 · 623 阅读 · 0 评论 -
排列
题意:给出一个小于等于10位的数,再给一个mod数, 这个字符串的数可以任意换,求出其能被mod求余为0的排列个数。思路:用dp[i][j]代表i是一个二进制数,每一位代表其取与不取。 j是代表取数的状态为i 时的余数。 转移方程:dp[i][j] += dp[i-(1#include#include原创 2013-06-08 16:46:03 · 482 阅读 · 0 评论 -
择偶原则
题意:给出N个数,求每一个数中与其它数相与的结果为0,如果有多个,选最大的,如果没有输出0思路:用dp[i]保存的是比i 小的任意j 满足i|j=i ,dp[i]是满足这样条件的最大值。这个一直LTE,,因为OJ里的测试数据有很多,且很多情况应该都是长度比较小的。所以对长度比较小的数据组用直接判断的方法就行。,,感觉过题无招的感觉。,,真正过题的应该不是这样的#in原创 2013-06-08 16:40:28 · 794 阅读 · 0 评论 -
吴神,人类的希望(1721)
题意:给出一个数,把其分成不同的数的组合的和是这样的数,且满足两一个分出来的数要大于等于K 求这样的组合有多少个思路:就是用DFS依次搜索分出的数的组合个数(一定要是增序的,不然会有更多结果) 但只是DFS会超时的,这样就可以用dp[i][j]来记录其计算过的值。其意思是i的数 当然选的是j大的数(所以后面的搜索就不能小于这个数了)但原创 2013-06-07 13:26:55 · 1152 阅读 · 0 评论 -
(离散) Making the grade (P3666)_
题意:给出一个序列,,单独的一个数可以任意加减, 求把这样的序列变成最长不减序列时对每个数的相加或相减的数目之和思路:1、把给定的序列排好序,就成为其离散的不下降的点 2、对第一点进行与排好序的最小值的点进行比较,求得dp[0][j]要升到第j的高度时所要的花费 3、对第二点及以后的每一点进行更新。dp[i][j原创 2013-05-28 15:54:39 · 1893 阅读 · 1 评论 -
(树形DP) 最优连通子集(POJ1192)
题意:给出一个树形结构的在坐标上连通的点,如果两个点相邻(或相连)则其x,y上的坐标差之和为1 每一个点有一个权值,要得其中的一个连通子集的最大权值之和思路:就是用DFS搜索,用一个一维数组ans[i]记录在选取i点时加上其子结点的连通子集的最大权值。 最后找出最大的ans[i]就可以了。感受:最近做 CDOJ做郁闷了,什么题原创 2013-05-27 19:58:09 · 694 阅读 · 0 评论 -
#173.D
这是一个博弈题,自己还是不太会做,用DP,,好不容易才知道一点,#include#include#include#include#include#includeusing namespace std;#define N 333int dp[N][N]={0};int a[4];int n;int make(int x,int y){ if (dp[x]转载 2013-03-14 18:18:17 · 729 阅读 · 1 评论 -
(树形DP) Strategic game(P1463)
今天再做了一道树形DP的题,,在不知道DP之前这个题当时抓破了脑袋也没有出来。题意:有N个具有特定的连通关系的点,如果安排一个兵在一个点上,则在该点还有其邻点上都被监视着 为了使整个网络内都能够被监视,则最少需要多少个士兵。思路:就是找出满足相邻两边不能同时有兵士时的最大数量,然后用N减去这样的最大数就可以了误区:我开始就这样想的,可是做对了才想起原创 2012-11-18 16:03:31 · 552 阅读 · 0 评论 -
(树形DP)Party at Hali-Bula(P3342)
这个题是P2342的升级版题意:请一伙人来参加PARTY,他们都有上级与下级的关系,因为直属上级与下级之前在一起 会很不尽,所以要避免这样的情况发生。在满足这样的情况下求能参与PARTY的最多人数。思路:先对其进行DFS,在其中回塑的时候就从基层开始DP,最后是对其唯一性进行判断难点:判断唯一性。是大BOSS不能是d[1][0]==d[1][1],原创 2012-11-18 00:02:42 · 530 阅读 · 0 评论 -
(树形DP_简单)Anniversary party (P2342)
这个是我做出来的第一道树形DP,是把DFS与DP的简单结合。思路:这个题默认就只有一个根结点,就先找到这个根结合,然后从根结点从上往下进行深 度遍历,然后在回塑的时候由最底层往上一步一步地DP就行了。#include#includeusing namespace std;#define N 6666#define inf -1000000原创 2012-11-17 10:19:10 · 309 阅读 · 0 评论 -
Cash Machine (P1276)
这个跟前面做过的一道题很类似,,所以轻松过题意:在存款机里有几种不同面值的货币,各有自己的数量。给定一个取款值。 求出小等于这个值的能取到的最大的数。思路:cash最大为100000,所以令一个这样大的数组,dp[i]是true时表示能取到这个值, 为false时表示不能取到。我是先把面值小的排在前面。(个人认为会快一些)优化:记录更新到的最大值原创 2012-07-29 00:25:12 · 458 阅读 · 0 评论 -
4 Values whose Sum is 0 (P2785)
这个题真是自己一下就想到的。不过在效率上比较低。4000MS+ 题意:给出四列数,有N排,在每一列中选一个数相加为0.的组合有多少组。思路:这种题数据比较大,用搜索是完全不可能了的。 用两个N*N大小的数组分别把数据的前两列(两列相互对应的,有N*N种情况)的和后两列的 数之和进行计算然后进行从小到大的排序,再原创 2012-07-28 23:06:06 · 440 阅读 · 0 评论 -
Polygon (p1179)
这个题自己看了题还是知道些思路的,但就是感觉自己比较懒,,不好。还是参考了一下人家的代码。自己的代码能力还是很弱啊。题意: 把一个圈(点为数字,边为乘或是加的去处操作) 先是去一条边,,然后就依次去边把边两端点的数进行运算,直到得到一个最大的数。 输出最后最大运算数,并输出得到这个最大数时第一条边去掉的是哪些边可以得到。思路:把该圈打开并使其长度为原来的两倍,这样一个一个转载 2012-07-28 17:42:26 · 483 阅读 · 0 评论 -
CF_353D (queue)
题意:在一个由男生和女生组成的队中,每一秒如果一个男生在一个女生的前面,他们就会互换位置。求女生全换到最前面用的最少时间。DP转移方程: ans=max(ans+1,pre); pre是从后往前到当前位置时的女生数 意思是在当前如果是男生并且该 男生后面有女生的存在,则选取 之前的最大时间再加一个或是后面女生数中最大的一个#include原创 2013-10-11 16:12:13 · 905 阅读 · 0 评论 -
导弹
题意:给出一串数字,代码高度。求其最长升序列的长度 , 并输出该序列。如果有多组输出字典数最小的。思路:由于这个题的数组长度很长,所以直接做的时间复杂度是O(N^2),所以会超时。 这时就要想出一个时间复杂度为O(NlogN)的方法。 用一个数组记录前i个数据的每个长度的升序列的位置及最小的数。原创 2013-11-22 01:00:45 · 827 阅读 · 0 评论 -
(状态压缩、位运算)Corn Fields (P3254)
题意:给出n*m的一个坐标,有些点可以种草,有些点则不可以。 种植的规则:1、每两个种植点不能有相同的边。 2、只能种在允许种的地方。 求出所有的种植方法数(注:也可以选择不种)方法:dp[i][k]中i是指在第几排,k是指在第i排的第k种状态。 状态的表示方法为:用一个整数的二进制位来表示种或不种。 初始状态:dp[0][0]=1表原创 2013-11-28 16:33:20 · 805 阅读 · 0 评论 -
RMS-ST算法
这个算法是基于DP,在预处理时间为O(nlogn),查找时间是O(1),所以说在一段上查找最大或最小值时该方法比线段树还要优。思路:m[j][i]原创 2014-10-20 13:13:44 · 1276 阅读 · 0 评论 -
状态压缩二 (hiho 1048)
题意:给出一个N*M的矩阵格子,用2*1的块去原创 2014-10-11 09:02:13 · 1204 阅读 · 0 评论 -
交错和 (hihocoder)
求L到R之间的交错和为K的转载 2014-10-08 16:23:20 · 3600 阅读 · 0 评论 -
hdu 2196 (树形DP)
题意:在一个树中,边会有原创 2014-10-24 00:03:29 · 684 阅读 · 0 评论 -
hdu1561 (树形DP_01背包)
题意:有N个城堡,在其中选M个并拿走其中的物品,看最多能拿原创 2014-10-22 20:30:26 · 874 阅读 · 0 评论 -
hdu1520 (树形DP)
题 意:是最单纯的树形DP,只是结点原创 2014-10-22 16:02:43 · 639 阅读 · 0 评论 -
hdu3336 Count the string(kmp+dp)
题意:给出一个字符串,原创 2014-09-18 18:52:04 · 789 阅读 · 0 评论 -
汉诺塔 (C#230)
题意:普通的汉诺塔,但是从一个柱子向另一个柱转移一个盘子会有一个权值。 求把N个盘子从第一个柱子转移到第三根柱上所需的最小权值和。思路:用三维数组dp[i][j][k]表示把i个盘子从柱子j转移到k所需最小权值和。 从柱子j转移到k有两种转移法(柱子标号0~2,所以3-j-k表示除jk外另一根柱子): (1) 上面原创 2014-02-19 14:11:51 · 848 阅读 · 0 评论 -
(DP状态压缩)Mondriaan's Dream(P2411)
题意:给出一个N*M的矩形,用许多的1*2的小方块,把大矩形填满的方式有多少种。网址:http://poj.org/problem?id=2411解法 1:在位中1表示横着的,0表示竖着的下面一位。#include#include#includeusing namespace std;int n,m;int Next;int next[14000]转载 2013-12-04 20:20:50 · 654 阅读 · 0 评论 -
(状态压缩) Most Powerfull (ZOJ 3471)
题意:有N(10个或以内)的原子,每个原子撞任意另一个原子会有一个能量值。然后被撞的会消失掉。 这N个原子有且只有一个。求:最大碰撞能量值。思路:用一个整数S来表示状态,其二进制的1表示原子还在,0表示已经消失。 dp[S]存在状态S下的最大能量值。网址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?pro原创 2013-12-10 15:25:53 · 688 阅读 · 0 评论 -
(状态压缩) Islands and Bridge (P2288)
题意:有N个点,M边条,找到一条哈密尔顿路,求最后的最大值及该值有多少条路径 第个点的值V[i],路径的值有三个来源 1、路中所有点的值相加 2、路中每两个相邻两点的积v[i]*v[j] 3、路中相隔一点的两点之间存在在路径则相加这三点的积方法:dp[S][i][j]: S为状态,i为上一个转载 2013-12-10 11:06:06 · 817 阅读 · 0 评论 -
(状态压缩) Travelling (HDU3001)
题意: ACMer 想要游玩n个城市,告诉我们每个城市间的旅行费用,并且要求每个城市最多走两遍!问最小花费是多少 ?!做法:用t[S][i]记录每个状态S的每位的数(3进制) 对于每一种状态找到其加一个城市的下一个状态。依次来就可以网址:http://acm.hdu.edu.cn/showproblem.php?pid=3001转载 2013-12-10 00:45:08 · 633 阅读 · 0 评论 -
(状态压缩) 炮兵阵地(P1185)
题意:在一个二维方格中,安置大炮。有平原有高山,只有平原可以安。 大炮的射程是四个方向,距离为2格。 求:最多能安多少个大炮。方法:对于每一行的一种状态用一个整数表示,第一个位对应一格,1代表放,0代表不放。 这样当前行的状态是否可行与当前行的地开有关,与相互之间的大炮安置位置有关, 与前两行的原创 2013-12-09 13:44:22 · 650 阅读 · 0 评论 -
(状态压缩) Hie with the Pie (P3311)
【题目大意】类似于TSP问题,只是每个点可以走多次,比经典TSP问题不同的是要先用弗洛伊的预处理一下两两之间的距离。求最短距离。【解析】可以用全排列做,求出一个最短的距离即可。或者用状态压缩DP.用一个二进制数表示城市是否走过【状态表示】dp[i][state]表示到达i点状态为state的最短距离【状态转移方程】dp[i][state] =min{dp[i][state]转载 2013-12-09 20:37:08 · 606 阅读 · 0 评论 -
Post Office (P1160)
题意:在一条线上有一系列的村庄,有一些邮局 ,求各乡村到最近的邮局的总路程最小值,乡村位置固定,邮局不定。思路:1、当有有几个村庄和一个邮局时,那邮局一定会存在于其中间, 2、其状态转移:代码中有一点说明。新收获:本来可以0MS AC的代码,如果前面加的#include#include#include#include#i原创 2012-07-27 19:20:25 · 546 阅读 · 0 评论 -
(大数据,导弹问题)Bridging signals (P1631)
方法:用一个数组B[i]记录在最大子序列长度为i 的最小的最后一 个数的最小值。#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;//freopen("C://i.txt","r",st原创 2012-07-26 20:02:40 · 367 阅读 · 0 评论 -
Adjacent Bit Counts(P3786)
这样的题就要按这样的思路好好想,,,,#include#include#include#includeusing namespace std;int dp[101][101][2];int main(){ freopen("in.txt","r",stdin); int i,j,k; int t; dp[1][0][0]=1; dp[1][0]原创 2012-05-20 17:55:21 · 755 阅读 · 0 评论 -
(分组背包)I love sneakers!(hdu3033)
#include#includeusing namespace std;int ff[20][20000];int main(){int ww[20][150],cc[20][150];int v,n,i,j,k,q;int t;while(scanf("%d%d%d",&n,&v,&q)!=EOF){for(i=1;i<=q;i++){ww[i][0]=cc[i][0转载 2012-06-02 22:45:34 · 1142 阅读 · 0 评论 -
(分组背包)ACboy needs your help(hdu1712)
#include#include#include #include#include#includeusing namespace std; int ans;int n,m;int go[111][111];void dfs(int cen,int days,int sum ) //这种方法太超时了{ //cout<<cen<<' '<<days<<' '<<sum<<原创 2012-06-02 21:59:32 · 474 阅读 · 0 评论 -
( 难)Jury Compromise(P1015)
很难,,参考了别人的代码.其中特别注意状态#include#include#include#include#includeusing namespace std;#define N 201int d[N];int p[N];int a[N],b[N];int dp[21][N*4];int path[21][N*4];bool notselected原创 2012-05-14 15:43:09 · 698 阅读 · 0 评论 -
Max Sequence(P2593)
和前一道题一样,,只改一点点就OK#include#include#include#includeusing namespace std;#define inf -100000000int main(){ //freopen("fuck.txt","r",stdin); int i,j,k; int t; int n; //cin>>t; int go[原创 2012-05-14 10:36:37 · 604 阅读 · 0 评论 -
Maximun sum(P2479)
先正把最优纪录下来,再反过来求DP#include#include#include#includeusing namespace std;#define inf -100000000int main(){ freopen("fuck.txt","r",stdin); int i,j,k; int t; int n; cin>>t; int go[5000原创 2012-05-14 10:31:32 · 339 阅读 · 0 评论