250 排列组合 数学题
统计每一个单词的数量,利用回文的特点,每次只考虑回文的左半部分,因此将之前统计的每一个字符数除以2之后进行排列组合的计算即可。需要注意的是其中字符数量为奇数的最多不超过一个。
// BEGIN CUT HERE
// END CUT HERE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
500 最小割 图论
从终点开始按照规则走遍改地图中所有的位置。发现凡是能被1*1那一面到达的格子(i,j)都与终点(ex,ey)满足约束关系。 i=ex(mod 3)j=ey(mod 3);这样我们就能找到所有1*1能够到达的格子。接着相邻的两个1*1的格子所连接的2个格子则是1*2 与 2*1的面能够直接到达的格子。为每一个1*1的格子标号接着建图。
将每一个1*1的格子拆成两点 i与 i‘ 若点i是普通的格子则连一条弧(i,i’)流量为1(去掉这个点的花费为1),如果是起点或者终点这流量为无限大。若是洞窟则为0;
对于这些1*1的格子如果是其起点这将源点s与i连一条弧(s,i)容量为无限大
对于这些1*1的格子如果是终点则将汇点与这点i连一条弧(i‘,e)容量为无限大
对于相邻的两点i与j
连两条弧(i’,j,c) (j‘,i,c) 流量c根据连接这两点的两个格子的情况有所不同。
// BEGIN CUT HERE
// END CUT HERE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
900 DP
首先将第一个人的位置固定在最左侧,这样的话只要将最终的结果乘以N就可以得到循环的效果。因为 ABC 与 CAB实际上的效果是相同的。
接着用DP[I][J]表示已经入座了i个人这时候有j个集合的情况数。
如果i==K则表示所有人已经入座,这个时候集合数量是j,这便意味着我们要将N-k个空余的座位放入j个间隔中(每一个至少需要有1个空余作座位),因此DP[i][j]=C(N-k-1,j-1)
其他的情况能够采取的策略有三种,分别是增加一个新的集合,合并两个旧的集合,将新的人加入到原有的集合中去。
对于增加一个新的集合的状况,我们需要注意的是不要让j超过G(限定的集合上限) DP[i][j]+=DP[i+1,j+1]*j
当合并两个集合时,需要j〉=2 DP[i][j]+=DP[i+1][j-1]*j
当添加一个集合的时候需分情况讨论,到人数等于座位数,且i==N-1的时候加入的位置固定 DP[i][j]+=DP[i+1][j]
其他情况是因为分别可以加在左侧和右侧,所以要乘以2 ,并且有j个集合可以加入 DP[i][j]+=DP[i][j]*j*2
// BEGIN CUT HERE
// END CUT HERE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include