摘要: dp[k][i][j]表示第k步左脚在位置 i,右脚在位置 j 状态时的最小能量消耗.dp[k][i][j] = min( dp[ k - 1 ][x][j] + cost[x][ step[k] ], dp[ k - 1 ][i][x] + cost[x][ step[k] ] );这题很坑爹的没有数据范围,数组我随便开的,居然1Y了…… 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace 阅读全文
posted @ 2013-05-05 22:08 冰鸮 阅读(207) 评论(0) 推荐(0)
摘要: 区间DP,刘汝佳黑书p113例题 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAXN = 210; 9 const int INF = 1 << 30;10 11 char str[MAXN];12 int dp[MAXN][MAXN];13 int path[MAXN][MAXN];14 bool vis[MAXN][MAXN]; 阅读全文
posted @ 2013-05-05 20:07 冰鸮 阅读(204) 评论(0) 推荐(0)
摘要: 题意:给你一棵树,求树中某节点子树中能力值大于它且忠诚度最高的那个。在第一次看到这个问题是,我有一个疑问:解决这个问题有两个关键点:1.树形结构到线性结构的转换原因:员工关系整棵树是一棵结构不确定的树,员工编号不一定连续,对于查询其符合条件的下属有很大困难(只能暴力)。而编号之后可以将子树映射到编号连续的一段区间,这时就可以用线段树快速查询最值。做法:用邻接表保存树,从根开始DFS,记录每棵子树的起始端点和终止端点。2.对能力值从大到小进行排序,按能力值从大到小的顺序加入线段树,能力值相同时,编号小的在前面。原因:因为每次要查找能力值大于该人且忠诚度最高的那个下属,所以当该点插入线段树时,线段 阅读全文
posted @ 2013-05-05 15:59 冰鸮 阅读(355) 评论(0) 推荐(0)