POJ
文章平均质量分 61
w1d2s
这个作者很懒,什么都没留下…
展开
-
POJ1014 多重背包问题
最近在看背包九讲,等全部看完了写一点原创 2014-11-10 16:27:32 · 437 阅读 · 0 评论 -
区间DP专辑 不断更新中
POJ 1651:记N个卡片为num[1]到num[N],容易发现取到最后总会剩下头尾两张卡片,就是说最后一次取的时候只剩下三张,只能取中间那张,所以将最后取走的那张卡片的位置当做区间的分割点,将问题分为左右两个区间的两个子问题,并且都满足最优子结构性质。记第i张卡片到第j张卡片的最优解为DP(i, j),那么可以得到状态转移方程:DP(i, j) = 0, 如果i = j - 1;DP(原创 2015-01-30 15:02:25 · 478 阅读 · 0 评论 -
两道水题
POJ 1088 滑雪 一开始行列搞反了 WA了一次#include <stdio.h>#include <stdlib.h>#include <string.h>#define inf 0x3f3f3f3f#define maxn 205int dp[maxn][maxn], dir[2] = {-1, 1};int map[maxn][maxn];int max(int a, i原创 2015-07-25 15:15:03 · 312 阅读 · 0 评论 -
POJ 1018 Communication System
题目点我 这道题有很多做法,贪心和搜索啥的都可以, 这里写动态规划的做法。 题目大意是说有一个通信系统,需要nn个设备,每个设备从mim_i个厂家中选择,每个厂家的设备有带宽bwbw和价格pp两个指标。最终选择完nn个设备后,令BB等于他们当中的带宽最小值,PP为他们价格总和,问最大的BP\frac{B}{P}值是多少。 如果定义状态dp[k]dp[k]为选择完第kk个设备后BP\frac{B原创 2015-07-24 16:05:01 · 363 阅读 · 0 评论 -
POJ 1564 Sum It Up
题目点我 简单的深度优先搜索,有一点判断重复的小技巧。 没加剪枝也16ms水过,等打球回来看看有哪能优化的。#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxn 15int t, n, nTotalSum;int nNum[maxn], nPath[maxn];bool bUsed[maxn];boo原创 2015-08-15 16:23:08 · 330 阅读 · 0 评论 -
nyoj 92 图像有用区域
题目点我 边界外加一圈从这一圈上某一点开始广搜,可以不漏掉每个边界上的像素。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>using namespace std;#define maxw 1500#define maxh 1000int map[maxh][maxw];int w, h原创 2015-08-13 18:06:04 · 334 阅读 · 0 评论 -
POJ 1191 棋盘分割
题目点我 经典的动态规划题目,首先将标准差公式变形一下: σ=∑ni=1(xi−x¯)2n−−−−−−−−−−−−√⇒n(σ2+x¯2)=∑i=1nx2i\sigma = \sqrt{\frac{\sum_{i=1}^n(x_i - \bar x)^2}{n}}\,\Rightarrow\,n(\sigma^2+\bar x^2) = \sum_{i=1}^nx_i^2 由于x¯\bar x是原创 2015-07-20 15:53:51 · 388 阅读 · 0 评论 -
POJ 1979 Red and Black
题目点我 水题。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;#define maxn 25char map[maxn][maxn];int cnt, w, h;void dfs(int x, int y){ if(map[y][x原创 2015-08-13 15:18:26 · 327 阅读 · 0 评论 -
POJ 1011 Sticks 经典的dfs+剪枝
题目点我 非常经典的搜索题目。 题目描述:乔治拿来一组等长的棍子,将它们随机地裁断(截断后的小段称为木棒),使得每一节木棒的长度都不超过50个长度单位。然后他又想把这些木棒恢复到为裁截前的状态,但忘记了棍子的初始长度。 请你设计一个程序,帮助乔治计算棍子的可能最小长度。每一节木棒的长度都用大于零的整数表示。基本思路是从木棒中最长长度max{Li}max\{L_i\}到总长度的一半totalLe原创 2015-08-10 14:42:09 · 449 阅读 · 0 评论 -
POJ 2248 & ZOJ 1937 Addition Chains
题目点我 或 点我 题目大意:给出数字nn,定义它的加法链为: • a0=1a_0 = 1 • am=na_m = n • a0<a1<a2<...<am−1<ama_0 < a_1 < a_2 < ... < a_{m-1} < a_m • 对于每个k(1≤k≤m)k (1 \le k \le m) 存在两个整数 (不一定不同)i i 和j(0≤i,j≤k−1) j原创 2015-08-22 16:14:56 · 494 阅读 · 0 评论 -
POJ 2362 Square
题目点我 和POJ 1011 Sticks几乎一样的题目,深搜+剪枝。尤其是记录上次使用木棍序号的剪枝,非常强力。#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxn 25int L, N, M, nTotalLen, nLastUsed;int nStickLen[maxn];bool bUsed[m原创 2015-08-14 18:34:52 · 314 阅读 · 0 评论 -
POJ 3278 Catch that cow
题目点我 简单的bfs,但是要剪枝。结果在剪枝数字的问题上RE了一万次,腿都软了。#include <cstdio>#include <stdlib.h>#include <string.h>#include <queue>#include <vector>using namespace std;#define maxn 200005int step[maxn];char vis[m原创 2015-08-08 16:21:04 · 338 阅读 · 0 评论 -
hdu 1506/poj 2559 Largest Rectangle in a Histogram
题目点我 傻B题目wa了半天,最后发现是因为中间计算结果太大,需要强制转换long long。 O(n2)O(n^2)做法会超时,用两个数组记录一个矩形向左和向右有多少个连续的不比他低的矩形。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;#de原创 2015-07-28 19:55:03 · 346 阅读 · 0 评论 -
nyoj 1015 二分图判断
题目点我 给出一个图,判断他是不是二分图。即能否将图的所有顶点分为两个集合,使得每条边的两个端点都属于不同集合。 做法是用广度优先搜索(BFS)。下面约定每个顶点的三个状态:白色为没有考虑过的顶点,灰色为等待处理(队列中)的顶点,黑色为已经处理过(已经弹出队列)的顶点。 每次拓展队列顶端的顶点vv,对于vv的每个后继uu,如果uu是白色的,将其划分到与vv不同的集合当中;如果uu是灰色或黑色,原创 2015-08-07 14:59:31 · 604 阅读 · 0 评论 -
POJ1458 最长公共子序列 经典DP
题目不说了,学习DP时候经典的例子。如果现在有两个序列X = {X1,X2,......,Xm}和Y = {Y1,Y2,.......,Yn},他们的LCS是Z = {Z1,Z2,.....,Zk}。下面分两种情况讨论:1) 如果Xm = Yn,那么一定有Zk = Xm = Yn,即Xm与Yn相等时他们一定是LCS结尾的那个元素。LCS(X, Y) = LCS(X', Y') + Xm。原创 2014-12-13 15:42:49 · 419 阅读 · 0 评论 -
POJ3661 背包DP
题目点击此处背包问题,考虑第i分钟是跑还是休息。设状态DP(i, j),表示第i分钟结束后疲劳度为j。状态转移方程:DP(i, 0) = max{DP(i-1, 0), DP(i-j, j)},其中i-j>=0, 0DP(i, j) = D[i] + DP(i-1, j-1), 其中0#include #include int dp[10005][505];int D原创 2015-02-03 16:16:27 · 376 阅读 · 0 评论 -
POJ1163 数字三角形 经典DP题目
题目大意:如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值的和最大。(图是我盗的)如果用数组num[j][i]表示j行i列的数字,dp[j][i]表示从该位置向下走的子问题的最优解,整个问题最终就是要求解dp[1][1],就是最顶端的位置的最优解。状态转移方程如下:dp[j][i] = max(d原创 2014-11-30 15:49:10 · 588 阅读 · 0 评论 -
POJ1384 完全背包问题
#include #include using namespace std;#define inf 0x3f3f3f3fint f[5000000];int min (int a, int b){return a>b ? b : a;}void CompletePack (int *f, int c, int w, int v){for(int i = c; i <= v; i++)f[i] =原创 2014-11-17 15:14:15 · 432 阅读 · 0 评论 -
百练 4103 踩方格
题目点我 好像是某一年微软编程之美的题目,其实有数学做法:令F(n)F(n)表示走n步的方法总数,则可以得到递推式 F(n)=F(n−1)+2∗∑k=1n−2F(k)F(n) = F(n-1) + 2*\sum_{k = 1}^{n-2} F(k) 以及两个边界条件 F(1)=3,F(2)=7F(1) = 3,F(2) = 7 每次考虑上一步方向是向北走的情况,从接下来这一步开始又成为了完原创 2015-08-24 18:06:44 · 1513 阅读 · 3 评论