03 2012 档案

摘要:经典的状态压缩和我的上一篇几乎一样,总的来说共有三种摆放方式:1、竖放 2、横放 3、不放代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define lld __int64 lld res[13][5000];int n,m;int dfs(int i,int j,int s1,int s2,int b1,int b2){ if(j>=m) { if(b1==0 && b2==0) res[i][s1]+=res[i-1][s2] 阅读全文
posted @ 2012-03-30 16:46 书山有路,学海无涯 阅读(188) 评论(0) 推荐(0) 编辑
摘要:看了大牛的博客才知道这道题是周伟《状态压缩》中的原题,搜了一下该文档,并仔细看了一下,让我茅塞顿开,原来是这样的:令res[i][j]表示前i-1行全部铺满,第i行状态为j的方法总数(某位置有木板则为1,反之则为0);当我们确定了第i行的状态,才能够确定第i-1行的状态。所以我们枚举第i行的所有状态就ok了。总的来说一共有7放法:1、 长方形木板竖放2、 长方形木板横放3、 缺左上角的L形木板4、 缺右上角的L形木板5、 缺左下角的L形木板6、 缺右下角的L形木板7、 不放假如我们用dfs来遍历的话,我们可以用 i,j, s1,s2,b1, b2;分别表示当前第i行、当前第j列、i-1行状态为 阅读全文
posted @ 2012-03-30 16:21 书山有路,学海无涯 阅读(282) 评论(0) 推荐(0) 编辑
摘要:令a[i]表示i不排在最后的总数,b[i]表示排在最后的总数,则递推公式如下:a[i]=a[i-1]+b[i-2];b[i]=b[i]+b[i-3];#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[56],b[56];int main(){ int i,n; a[1]=0; b[1]=1; a[2]=0; b[2]=1; a[3]=1; b[3]=1; for(i=4;i<=55;i++) { a[i]=a[i-1]+b[i-2]; ... 阅读全文
posted @ 2012-03-27 22:03 书山有路,学海无涯 阅读(169) 评论(0) 推荐(0) 编辑
摘要:状态转移方程如下:res[i][j]=max{res[i-1][j-1]+f(str1[i],str2[j]),res[i-1][j]+f(str1[i],’-‘),res[i][j-1]+f(‘-‘,str2[j])};#include<iostream>#include<cstdio>#include<cstring>using namespace std;char str1[101],str2[101];int d[5][5]={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2, 阅读全文
posted @ 2012-03-26 09:14 书山有路,学海无涯 阅读(183) 评论(0) 推荐(0) 编辑
摘要:虽然二分查找我已经写过很多遍了但是每次重新写的时候总是不那么顺畅,一些小错误不断出现,因此想写几个模板……..在不降序列中查找第一个大于goal的元素位置,若没有比goal大的返回最后一个,若都比goal大返回第一个:int find(int * res,int left,int right,int goal){ int mid; while(left < right) { mid = (left + right) >> 1; if(res[mid] > goal) right = mid; else ... 阅读全文
posted @ 2012-03-23 15:00 书山有路,学海无涯 阅读(732) 评论(2) 推荐(1) 编辑
摘要:Dilworth定理及其对偶定理的应用,定理的讲解请看如下博客http://blog.csdn.net/xiaohuan1991/article/details/6956629#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAX 123456789struct node{ int x,y;};node vert[20001];int res[20001];int cmp(node a,node b) 阅读全文
posted @ 2012-03-23 13:29 书山有路,学海无涯 阅读(246) 评论(0) 推荐(0) 编辑
摘要:又一道双进程DP,状态转移方程如下:f(k,i,j)=max(f(k-1,i,j),f(k-1,i-1,j),f(k-1,i,j-1),f(k-1,i-1,j-1))然后f(k,i,j)加上(i,k-i)和(j,k-j)上的interesting locations。注意i和j相等的情况。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int map[110][110];int res[211][110][110];inline int max(int a,int 阅读全文
posted @ 2012-03-21 13:28 书山有路,学海无涯 阅读(335) 评论(0) 推荐(0) 编辑
摘要:双调欧几里得旅行商问题:http://blog.sina.com.cn/s/blog_51cea4040100gkcq.htmlf(i,j)表示第一个人走到i点,第二个人走到j点所行走的最短距离,前i个都已经走过。所以将要到达第i个点时,第i个点有可能交给第一个人,也有可能交给第二个人,两种情况下与f(i-1,j) 都有什么关系呢?第一种情况下:f(i,j)=min{f(i,j),f(i-1,j)+dist(i-1,i)};第二种情况下:f(i,i-1)=min{f(i,i-1),f(i-1,j)+dist(j,i)};(f(i,i-1)==f(i-1,i))代码如下:#include< 阅读全文
posted @ 2012-03-20 20:05 书山有路,学海无涯 阅读(615) 评论(0) 推荐(0) 编辑
摘要:Nyoj 61 传纸条前几天无意中看到多进程DP,原来我苦恼很长时间的传纸条问题竟然是双进程DP,搜了几篇大牛的关于双进程DP的文章,有些思路了:拿传纸条问题来说吧,其实就是找两条从左上角到右下角不相交的路径(除了头和尾),使路径上的和最大。因为路径不能相交,所以我们必须同时考虑两个人的位置,若两人的位置设为x1,y1, x2,y2,状态转移方程可以写成如下形式:f(x1,y1,x2,y2)=max{f(x1-1,y1,x2-1,y2),f(x1-1,y1,x2,y2-1),f(x1,y1-1,x2-1,y2),f(x1,y1-1,x2,y2-1)}+map[x1][y1]+map[x2][y 阅读全文
posted @ 2012-03-20 13:48 书山有路,学海无涯 阅读(438) 评论(0) 推荐(0) 编辑
摘要:典型的背包问题,状态转移方程如下:res[i][j] 表示用i的忍耐度杀j个怪兽获得的最大经验值。res[i][j]=max(res[i-weight[k]][j-1]+value[k], res[i][j]);代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int weight[101],value[101],res[101][101];int max(int a,int b){ return a > b ? a : b;}int work(int 阅读全文
posted @ 2012-03-20 13:16 书山有路,学海无涯 阅读(180) 评论(0) 推荐(0) 编辑
摘要:题目大意:在一个无向图中求一个点到另外两个点的距离之和的最小值。设源点为S,另外两个点为A、B。我们可以先这样想:假如S到A、B两个点的最短路径没有交叉,那么结果就是dist[A]+dist[B];其实这个值也是最大值。如果有交叉的情况又是什么样的呢?假设交叉点是C,C到A、B的最短距离是dist1[A]、dist1[B]。那么结果很显然就是 dist[C]+dist1[A]+dist1[B];我们枚举所有的C点,求取最小的dist[C]+dist1[A]+dist1[B],不就OK了吗。然而再想想时间复杂度吧,以上做法可能会达到O(n^3)的复杂度。试着做了一下,果然超时。其实我们仔细想一想 阅读全文
posted @ 2012-03-12 08:32 书山有路,学海无涯 阅读(219) 评论(0) 推荐(0) 编辑
摘要:Stringsobits Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit users: 40, Accepted users: 22 Problem 10490 : No special judgementProblem descriptionConsider an ordered set S of strings of N (1 <= N <= 31) bits. Bits, of course, are either 0 or 1.This set of strin 阅读全文
posted @ 2012-03-05 09:04 书山有路,学海无涯 阅读(217) 评论(0) 推荐(0) 编辑
摘要:题目大意:给出三个数n,k,m,n可以+m、-m、*m、%m,每次求出的结果,再用n保存起来,%的定义如下:若n=x*m+q 满足m>1 && q>=0 则q为n%m的值(和平常取余不一样)。求最少多少步使得n的初始(n+1)%k等于当前的 n%k,并输出操作符顺序,若有多种解则输出操作符序列最小的,最小的定义就不说了。WA了n次不知道为何,后来看了大牛的分析才得知%的出现是可以推算出来的。若不加访问标志的话,复杂度必然会高,若果我们将每次取得的n值,做下n=n%k的话那么我们就可以定义一个访问标志数组。那么这么做对不对呢?我们先看一下 ((n ope m)%k o 阅读全文
posted @ 2012-03-01 08:55 书山有路,学海无涯 阅读(458) 评论(0) 推荐(0) 编辑

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