摘要: 题目链接题意: 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要 求,则就是新的完美队形: 1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的; 2、左右对称,假设... 阅读全文
posted @ 2014-04-20 15:53 Teemo的技术blog 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:有只牛要吃草,现在有个墙挡着,给你绑着牛的绳的长度,墙的长度,绳原点到墙的距离,问牛能在多大的面积里吃草思路:分为四种情况,详情请看书。被dp卡着这题没做成 1 #include 2 #include 3 #include 4 #include 5 using namespace s... 阅读全文
posted @ 2014-04-19 17:08 Teemo的技术blog 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:给你一个无向图,求n边的最短路思路:用最短路想了半天都没想出来,比赛结束回去看看原来用dp做,我的dp有待提高啊sp[i][k]=min(sp[j][k-1]+dp[j][i])//k为多少条边,j能到i#include #include#includeusing namespace std;#define INF 0xfffffff#define MAXN 1100#define MAXH 10int d[MAXN][MAXN];int sp[MAXN][MAXH+10];int n,m,t; void init(){ int i,j,a,b,c; for(i=0;ic){// 阅读全文
posted @ 2014-04-19 15:56 Teemo的技术blog 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 题目链接题目描述:哈密尔顿路问题。n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算:1.每一个点的权值之和2.对于图中的每一条CiCi+1,加上Vi*Vi+13.对于路径中的连续三个点:CiCi+1Ci+2,若在图中,三点构成三角形,则要加上Vi*Vi+1*Vi+2求一条汉密尔顿路可以获得的最大值,并且还要输出有多少条这样的哈密尔顿路。这道题的状态感觉不是很难想,因为根据一般的哈密尔顿路问题,首先想到的是设计二维状态,dp[i , s]表示当前在i点,走过的点形成状态集合s。但是这道题在求解值的时候有一个不一样的地方,就是第三部分, 阅读全文
posted @ 2014-04-17 21:01 Teemo的技术blog 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:有n个人想成为少林,但是成为少林必须跟少林的大师大一场,当然要选择战斗力很近的,有两大师战斗力跟那人相近程度一样就选战斗力小的那个,按输入顺序,先输入的人先成为少林大师,后面输入的人,选一个前面输入的人打一场,当然少林已经存在一个超级大师(初始号码为1,不用输入已存在)。思路:我开头用排序搞来搞去都没成,后来看看人题解,瞬间发觉set很好用,像优先队列一样自己会排好序了。函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置举例如下:一个数组number序列为:4,10 阅读全文
posted @ 2014-04-15 14:56 Teemo的技术blog 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:你现在分数为a,对方分数为b,你比赛还有n分钟,每次进攻需要15分钟,现在你先进攻,每次进攻可以得1或2或3,对方每次进攻得一分,问超过对方分数有多少种打法思路:因为情况太多要用__int64,很简单的dp,dp[n][m],n为第几次进攻,m为得分#include #include#includeusing namespace std; int dir[]={1,2,3};__int64 dp[40][120];int main(int argc, char** argv) { int a,b,t,n,m,i,j,k,s; while(scanf("%d%d%d&qu 阅读全文
posted @ 2014-04-13 22:20 Teemo的技术blog 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:给你一棵树(必须从根节点出发),每个节点上都有bug和value,你有m个骑士,每个骑士能消灭20个bug,你必须消灭该节点的全部bug才能拿到该节点的value,问最多能拿到value是多少.思路:典型的背包dp , dp[n][m]=max(dp[n][m-x]+value,dp[n][m])#include#includeusing namespace std;#define N 110#define INF 999999999struct node{ int v,next;}edge[Nb?a:b;}void AddEdge(int u,int v){ edge[edge 阅读全文
posted @ 2014-04-13 11:26 Teemo的技术blog 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 题目链接题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小。思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+dp[son[i]][k-r]}#include #include#includeusing namespace std; #define MAXN 250struct node{ int from,to,next;}edge[MAXN];int tot,head[MAXN],visit[MAXN],value[MAXN],dp[MAXN][MAXN],f[MAXN][MAXN];int n,m;voi 阅读全文
posted @ 2014-04-12 21:21 Teemo的技术blog 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案。思路:状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765用1表示放置了骨牌,0表示没有放置。dp[i][j]表示第i行为状态j是有多少种方案。分下面3种情况进行转移: d表示当前列号,s1 表示本行的状态,s2表示上一行的状态,1 竖直放置 那么d=d+1,s1#includeconst int N = 12; const int maxn = 1<<N;using namespace std;int n,m;__int64 dp[N][maxn 阅读全文
posted @ 2014-04-07 23:08 Teemo的技术blog 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快乐指数最高。思路:用树状dp,dp[i][0]为不参加会议,dp[i][1]为参加会议#include#include#include#define N 6010using namespace std;vector v[N];int dp[N][2],hp[N],mark[N];int max(int a,int b){return a>b?a:b;}void dfs(int k){ int 阅读全文
posted @ 2014-04-05 22:42 Teemo的技术blog 阅读(156) 评论(0) 推荐(0) 编辑