蒟蒻比赛记录

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本身相等,则该数就是一个平方数,当然平方数不能为负数.

posted @ 2021-03-21 17:36  gonghw403  阅读(16)  评论(0编辑  收藏  举报