蒟蒻比赛记录
1.n叉树父子关系公式:
第i个节点,父亲为第j个节点,公式如下:
j = [(i-2) / n] + 1 (其中[]表示括号内 向下取整 )
2.LCS(最长公共子串)dp 做法 (子串不一定在主串中 连续 )
和01背包类似,分为相等或不相等, dp[i][j]表示a主串中第i个字符,j表示b主串中第j个字符
当 a[i] == b[j] 时,也就是相等,dp[i][j]=dp[i-1][j-1]+1;
当 a[i] != b[j] 时 在dp[i-1][j] 和 dp[i][j-1]中选一个最大值 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
3.运用vector实现0(1)删除和查找
vector<int> a //指定位置为i
用vector储存数据可以实现 快速的删除和查找某个指定位置i的值
查找可直接用下标加[]的操作 即 a[i]为要查找的值
而删除元素a[i],可以用
a.erase(a.begin()+i-1); // 由于vector是从0开始的,故第i个为从头数第i-1个
4.LCS补充(最长连续公共子串)dp 做法 (连续相等子串的最大长度)
for(ri i=1;i<a.size();++i)
{
for(ri j=1;j<b.size();++j)
{
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
maxx=max(maxx,dp[i][j]);
}
}
dp[i][j]内存的是a主串1-i长度的子串和b主串1-j长度的子串之间连续相等子串的最大长度
由于结果不连续用maxx保存dp[1-a.size()][1-b.size()]中最大值即是答案
tips: dp下标都从1开始防止i-1时出现dp[-1][-1]的错误
5.用string使输入字符串下标从1开始
string a;
cin >> a; //此时输入字符串从0开始
a.insert(a.begin(),'0'); //在0位置插入'0'使整体后移。此时输入字符串从1开始
// 注意!插入后得到的a.size() 是原字符串的长度+1 (因为插入了一个字符)
// 输入字符串 1 --- a.size()-1
6.digital root 数根
数字根(digital root)是自然数的一种性质,即每个自然数都有一个数字根。数根是将一自然数的各个位数相加(即横向相加),若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于10为止。例如54817的数根为7,因为5+4+8+1+7=25,25大于10则再加一次,2+5=7,7小于10,则7为54817的数字根。
有结论公式:0的数字根为0,9的倍数的数字根为9,其他自然数的数字根为其除以9的余数
可整体写成 a的数根b=(a-1)%9+1
其中a-1防止a为9的倍数导致结果为0,+1将a-1的1补上,当a=0时, -1 mod 9 =-1 ,再加一为0
c++中取模 n%m结果符号和n的符号一致
7.快速判断一个数是否为平方数
#include <math.h>
bool is_square(int n)
{
return (n>-1) && (sqrt(n) == (int)sqrt(n));
}
sqrt函数返回值本身为浮点数,若转化为int与sqrt本身相等,则该数就是一个平方数,当然平方数不能为负数.