Topcoder 选做
Topcoder 部分题目选做
AmoebaCode(10801)
题意:给定一个字符串 \(s\),和一个整数 \(K\),满足 \(K \le 7,K+1 \le |s| \le 50\) 字符串由字符 0-K 组成,你需要将每个 0 替换成 1-K 中的任意一个字符,使得整个字符串的权值最大,输出最大值;字符串的权值定义为,对于所有满足 \(x \neq y,s_x=s_y\) 的二元组 \((x,y)\),\(|x-y|\) 的最小值。
分析:考虑到 \(K\) 很小,我们从大到小枚举 \(K\),记现在枚举到的数为 \(k\),令布尔值 \(f(i,S)\) 表示,是否存在一种方案,满足 \(s[1,...,i]\) 的权值 \(\geq k\),且 \(s[i-k+1,...i]\) 中构成序列 \(S\),转移显然,若 \(s_i=0\),则枚举 \([1,K]\) 中的所有数去转移,否则直接用 \(s_i\) 转移。
时间复杂度 \(O(NK^K)\),考虑到存在不合法状态,算法跑不满,可以通过。
ExactTree(13857)
题意:给定 \(n,m,r\),对于一棵树 \(T\),定义函数 \(S(T)\) 表示 \(T\) 中每两个节点 \(x,y(x<y)\) 的距离之和,求一棵 \(n\) 个点的树 \(T_n\),满足 \(S(T_n) \mod m = r\) 且 \(S(T_n)\) 最小,输出 \(S(T_n)\) 的最小值。
分析:定义 \(f(x,y)\) 表示,一棵 \(x\) 个节点的树 \(T_x\),满足 \(S(T_x) \mod m = r\),对答案贡献的最小值。转移时枚举一个 \(i(i \in [1,x))\),令 \(j=x-i\),再枚举 \(i,j\) 对应的函数值 \(vi,vj\),将 \(T_i\) 和 \(T_j\) 合并,记合并后的函数值为 \(S'(T_x)\),易得 \(S'(T_x)=vi+vj+i(n-i)\),用这个值去更新 \(f(x,*)\) 的状态即可。
时间复杂度 \(O(n^2m^2)\)。

浙公网安备 33010602011771号