题目链接:UVALive
比赛链接:http://vjudge.net/contest/view.action?cid=48016#overview A:
Binary Matrix
题意就是有一个01矩阵,可以交换相邻的,第一行和最后一行相邻,第一列和最后一列相邻。 如果可以到达每行1个数一样,每列1个数一样,输出最少步数。 如果上面的不行,输出达到每行1个数一样的最少步数。 如果不行,输出达到每一列1个数一样的最少步数。 上面都不行输出impossible. 使用最小费用最大流去求最小步数,很简单的建图。
1 | /* *************** |
B:
Candles
用0~9的数字拼成一个数,可以是直接拼,每个数字最多使用一次。 也可以是两个数相加,数字也最多使用一次。 给了n个数,找一个组合,可以表示出这n个数。 简单预处理下,就可以枚举判断了。
1 | /* *************** |
C:
Cards
普通的概率DP 按照规则进行转移,注意两个王的处理,需要标记。
1 |
|
D:
Game of Connect
题意就是一个n个点,m条边的图。 第一个人首先指定两个不同的顶点A和B。 然后两个人轮流进行操作,第一个人先操作。 第一个人删掉一条没有染色的边,第二个人将一条没有删除的边进行染色。 当A和B两点用染色的边连通时,第二个人获胜。 问的第二个人有没有必胜策略。 其实就是在原图中 找出两个不相交的生成树。 代码参考:here 留个坑,待填! E:
Guards
题意:NN的格子上放一些人,每行每列刚好两个,同一行同一列的位于同一连通分量,问恰好k个连通分量的放法。 \[2<=N<= 10^{5}, 1 <= K <= min(N, 50)\] DP 很明显的思路,主要是怎么样转移。 思维方式不唯一。 我是f[i][j] 表示i\i的,j个连通分量的方法。 g[i][j] 表示i*(i-1)的,j个连通分量的放法。 i(i-1)肯定是有两行是只有一个的。 然后分这两个在同一列和不在同一列。 如果在同一列,可以把这个两个去掉,其实就是(i-2)(i-2)里面的了,可以由f[i-2][j-1]转移过来。 如果不在同一列,去掉这两行,发现可以由g[i-1][j]转移过来。 代码:
1 | /* *************** |