2013-2014 ACM ICPC Central European Regional Contest (CERC 13) K题(dp)
题意:给出n个,长度为2的限制出现的字符串,构造一个字符正方形,使得每一行从左往右读,每一列从上往下读都不会出现限制字符串,超过20*20就构造20*20。
解题思路:先把题目转换一下,26个字母两两组合,一共是26*26种方法,去掉限制的,剩下的就是能用的了。开个26*26的数组,把不能用的标记掉。做比赛的时候还是想到了一点,就是先构造一个尽可能长的,能循环的,即最后一个字符跟第一个字符组合也是能用的,不包含限制字符串的串,然后往矩阵里面填,因为能循环,所以肯定能把这个正方形填满。但是写完交上去,wa了。因为这样并不是最优的,比如能用的有6个字符串分别是:
ab
bc
cd
de
ef
fg
那么这样能构造的正方形大小是4*4的,如图:
好了,找到数据了,那么再找找规律,就好构造了。其实就是构造两个长度尽可能长,且第一个串的结尾与第二个串的开头相接不会被限制,(如上图),且长度相同的串就好了。用dp[i][j][k],表示能否构造出以i开头,以j结尾,长度为k的串,dp转移就是类似floyd(我能说这就是floyd吗?),完了之后输出路径把两个字符串保存下来,然后按规律填到正方形里面。
代码: