摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520思路:dp[u][0]表示不取u的最大价值,dp[u][1]表示取u的最大价值,于是有dp[u][0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0](其中v是u的孩子)。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 6060 8 9 int dp[MAXN][2];10 int n,ans;11 vector &g 阅读全文
posted @ 2013-09-10 23:20 ihge2k 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561思路:dp[u][i]表示以u为根的树选了i个子节点。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8 9 int n,m;10 int dp[MAXN][MAXN];11 int val[MAXN];12 vector >G;13 14 void dfs(int u,int father)15 {16 for(int i=0;i=1;.. 阅读全文
posted @ 2013-09-10 22:41 ihge2k 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809思路:简单的状压dp,看代码会更明白。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 struct State{ 8 int ati,def,hp,lev,exp; 9 }dp[1=S.lev*100){43 S.lev++;44 S.ati+=In_ati;45 S.d... 阅读全文
posted @ 2013-09-10 15:29 ihge2k 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196思路:首先任意一次dfs求出树上最长直径的一个端点End,然后以该端点为起点再次dfs求出另一个端点,然后再次以求出的另一个端点为起点dfs,每次做dfs的时候都更新dist[](dist[u]表示u到树上任意节点的最远距离),可以证明树上任意某个节点到树上任意节点的最远距离的端点一定会是树上直径的两个端点之一。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAX 阅读全文
posted @ 2013-09-10 10:58 ihge2k 阅读(1588) 评论(1) 推荐(2) 编辑