hdu5318
题目
http://acm.hdu.edu.cn/showproblem.php?pid=5318
思路
题意就是给n个串,串和串可以相连的条件就是一个串的后缀与另一个的前缀相同而且相同部分长度大于1,问有多少种方案连了m个串。
dp[i][j],当链接了i个串后,以第j个串结尾的有多少种。这样dp[i][j] = ∑dp[i-1][k] (k串后面可以接j)也就是dp[i][j] += dp[i-1][k]*a[k][j],a[k][j]是预处理好的k串和j串是否可接。可以用矩阵优化。
注意矩阵的初始化以及要排除一开始的重复的串,否则会导致多算。
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<fstream>
#include<set>
using namespace std;
#define ll long long
const int mod=1000000007;
int n,m;
char chain[60][20];
int con[60][60];