POI就算是很老的题目也很锻炼思维啊。。。
Description
N个点用M条有向边连接,每条边标有一个小写字母。 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径。 如果没有,输出-1。 如果有,输出最短长度以及这个字符串。
Input
第一行正整数N和M ( 2 ≤ N ≤ 400 , 1 ≤ M ≤ 60,000 ) 接下来M行描述边的起点,终点,字母。接下来D表示询问序列长度 ( 2 ≤ D ≤ 100 ) 再接下来D个1到N的整数
Output
对于D-1对相邻点,按要求输出一行。如果没合法方案,输出-1。 如果有合法,输出最短长度
Sample Input
6 7
1 2 a
1 3 x
1 4 b
2 6 l
3 5 y
4 5 z
6 5 a
3
1 5 3
Sample Output
3
-1
题意很好理解就不说了
比较容易想到枚举中间点向两边扩展,或者对于询问序列,枚举中间点,思想差不多,反正都会T。
设f[i][j]表示从i到j的最短回文路,g[i][j][k]表示从i到j的最短回文路再加上一个字符k(最后一条边不回文)。
那么我们可以用g[i][j][k]更新f[i][j],也可以反过来更新。具体来说:
f[i][j]=g[k][j][