随笔分类 - DP
摘要:题目是问把一棵树通过剪边、加边形成一个环的最小代价。分成两步,先把树剪成一些链,再把链连接成一个环。设一棵有n个节点的树,剪掉X条边后,形成L条链。那么代价为X+L。n-1-X=edgeNum(L条链) ① //原本有n-1条边,剪掉X条,还剩edgeNum(L条链)条edgeNum(L条链)+L=n ② //L条链的这些边+L条边形成一个有n条边的环由①、②得到,L=X+1则代价为 X+L=2*L-1=2*X+1。问题转化成了,把一棵树剪成一些链,最少能剪成几条链?或者,最少需要剪掉多少条边?我觉得到了这一步问题就好解决了,我是树形dp搞的,求的是最少能剪成几条链。dp[u][0]表示u节点
阅读全文
摘要:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs。反例:5 41 2 22 3 12 4 -1004 5 10写树形dp的时候,WA了好多次,错误在于:记录单链的时候,一个节点的最长单链不一定等于:边权+孩子的最长单链还可以不选孩子,只要边权就行!!!!!!如果边权非负的话,就是 边权+孩子的最长单链 了。思路: dp[u][0],记录的是以u为根结点的子树中的最长路 dp[u][1],记录的是以u为起点的向下的一条最长链转移时: a记录的是max{ dp[sons...
阅读全文
摘要:这个题目看网上好多题解都是直接O(n*m)卡过。我是这么做的。对于m次操作,统计每个w的次数。然后对每个w做矩阵乘法。这样直接做矩阵乘法是会TLE的。又由于这里的矩阵很特殊,一次乘法可以降维成O(n^2)。--------------------------怎么降维的可以这样模拟下:a b c a b c a*a+2bc c*c+2ab b*b+2acc a b * c a b = b*b+2ac a*a+2bc c*c+2abb c a b c a c*c+2ab b*b+2ac a*a+2bc注意到原矩阵的每一行(除了第一行)都是上一行向右平移一个单位的结果,而相乘得到的矩阵也满足这个性质
阅读全文
摘要:题意:有n种珠宝,每件珠宝有必须要买的数量ai和单价pi,c种珠宝的单价递增。如果买了某种珠宝,需要额外付一次10*pi的费用(据说是为了防止你只买一件。。。),同时可以买同等数量单价高的珠宝代替单价低的珠宝,这样可能会省一些钱。求买完所需的珠宝需要的最少花费。分析:比如5……n的珠宝中,第6,7,9,11种珠宝被购买,称为A,其余是被替换的,称为B。那么对于第4种珠宝,若选择购买B类珠宝,那么都没有选择自己优。若选择购买A类珠宝,那么选择第6种珠宝最优。原因是一样的,首先是价钱在同类中最低,而且对于1……3种珠宝的替换在同类中最有利。可以发现,6,7,9,11 or 6,8,12,15,or
阅读全文
摘要:这个题目如果直接暴力枚举的话,复杂度是n*C(n,k),最坏情况约10^37。考察下面这种情况:(n=5,k=3,粗体及加下划线的节点为depot所在地)① ② ③ ④ ⑤① ② ③ ④ ⑤对于④及以后的节点,在④被选中后,距离它们最短的depot一定不会在④之前(因为距离一定比④远)。也就是说④及之后节点的最优情况与④之前的节点无关,图示两种情况对于④及以后节点是等价的。状态基本上就出来了。我从中提取出的状态是[s][num],表示在s号节点被选定后,节点s……n之间还剩num个位置要选时的最优值。预处理出disSum[N][N]数组,表示在节点i和节点j被选定后(j>i),i……j之
阅读全文
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int MAXN = 2000000000; 6 7 bool vis[32][21][15][13]; 8 int f2[32]={1},f3[21]={1},f5[15]={1},f7[13]={1}; 9 int dd[6000],cnt;10 11 void dp(int a,int b,int c,int d,long long x)12 {13 if( vis[a]
阅读全文

浙公网安备 33010602011771号