摘要:
又一道双进程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 阅读全文
摘要:
双调欧几里得旅行商问题: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< 阅读全文
摘要:
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 阅读全文
摘要:
典型的背包问题,状态转移方程如下: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 阅读全文
摘要:
题目大意:在一个无向图中求一个点到另外两个点的距离之和的最小值。设源点为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)的复杂度。试着做了一下,果然超时。其实我们仔细想一想 阅读全文
摘要:
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 阅读全文
摘要:
题目大意:给出三个数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 阅读全文
摘要:
今天也算是练习了一下记忆化搜索,这道题也包含很多值得注意的地方1、 输入的两个数不一定前者比后者大2、 变换的过程中可能会超出int范围3、 为了不超时可以作下预处理#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define MAXINT 1000001int res[MAXINT];int dfs(long long t){ if(t<=1) return 1; if(t<=MAXINT && res[t]!=0) return r 阅读全文
摘要:
一道很好的搜索题目,但是好久没有弄懂题意,题意大致是这样的:在一个地图上给出自己的位置‘Y’,目的位置‘T’,两种墙‘S’和‘B’,还有河‘R’,以及空地‘E’。‘S’和‘R’是不能穿过的,‘B’可以被炸毁但需要一个单位时间,每走一步也需要单位时间。求从初始位置到目的位置至少需要多长时间。dfs和bfs都可以来搜索,dfs复杂度比较高,但可以用记忆化搜索,我选择的是bfs,因为炸毁墙需要一个单位时间,所以按照平常的广搜是不行的,只能一各单位时间一个单位时间的来走,不能一次走两个单位时间。所以每次到达‘B’时,需要等待一个时间。#include<iostream>#include&l 阅读全文
摘要:
题意:给出两串,两串顺序不变看能否组成第三个串。此题深搜和DP都能解决:深搜的话需要几个强有力剪枝条件1、 第三个串最后一个字符要么是串1的最后一个字符,要么是串2的最后一个字符2、 按照串1的顺序对串3进行搜索,若不匹配则该字符必是串2的下一个字符。#include<iostream>#include<cstdio>#include<cstring>using namespace std;char first[202],second[202],third[402],Left[401];int sign[402];bool flag;int check(){ 阅读全文