这题起初以为是一个找规律题,然后就各种打表找规律,然而最后发现并不能找到什么规律,
其实是一个递推题目,主要就是看你能不能想到怎么取递推:
题目所求所有C之间的距离,又因为相加的性质,两边的单独处理是不变的,每次拼接之后多出来的只是两边各一个的情况,有了点分治的味道。而左右两边的情况则不妨将这段距离差分成x,y两部分分开计算。对于左串来说,每一个C都要和右串所有的C进行一次配对,所计算的距离是当前C距离拼接位置(也就是左串的末尾)的距离,所计算的次数为右串中C的个数。对于右串来说,每一个C都会和左串的任意个C进行配对,计算的距离亦是距离拼接位置的距离(可以利用补集的思想去求),计算的次数是左串中C的个数。
则递推关系为:
dp[i] = dp[i-1]+dp[i-2]+dis[i-2]*num[i-1]+(len[i-1]*num[i-1]-dis[i-1])*num[i-2];(dis代表当前串中C到末尾距离和,num表示C的个数,len表示长度)
同时:
len[i] = len[i-1]+len[i-2];
num[i] = num[i-1]+num[i-2];
dis[i] = dis[i-1]+dis[i-2]+num[i-2]*len[i-1];