摘要: S表示已用骰子的集合。dp[S][i][j]表示在当前集合下,最上面那个骰子为 i ,底面编号为 j 时所能得到的最大和, max[i][j] 表示骰子 i 以 j 为底时侧面的最大值,dice[i][j]表示 i 骰子 j 面的编号。dp[S][i][j] = max{ dp[ S ^ ( 1 << i ) ][k][m]+max[i][j] };k∈(S ^ ( 1 << i ) ), dice[k][5 - m]==dice[i][j]。为了方便判断相对的面,存储时处理一下,使得相对的面存储在编号加和为5的位置中。即如果 a, b 面相对,则 a + b = 5 阅读全文
posted @ 2013-05-04 22:19 冰鸮 阅读(188) 评论(0) 推荐(0)
摘要: 有两种做法:一种是经典二分图最小顶点覆盖,一种是树形DP,我用的后者。第一次学习树形DP…… 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <vector> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int MAXN = 1600;10 11 int N, root;12 int dp[MAXN][2];13 vector<int> tree[MAXN 阅读全文
posted @ 2013-05-04 08:59 冰鸮 阅读(320) 评论(2) 推荐(0)