国庆郑州集训day1 下午:基本算法

递推

计数DP也是递推的一部分

典型例题

(1)用1*2的骨牌覆盖2*n的矩形方阵
显然可以得到方程f[n]=f[n-1]+f[n-2]>>>>fibonacci数列
(2)长度为2n的合法括号序列个数
可以联系卡特兰数进行求解会非常方便。
用递推的思路可以得到方程f[n]=f[n]*f[0]+f[n-1]*f[1]+f[n-2]*f[2]……..
可以进行根据该方程进行递推
》》》》N个节点的二叉树的不同形态数喂卡特兰数的第N个

递归

汉诺塔

非常经典递归的问题。
对于当前N各盘子,可分解为讲上面n-1个小盘子移到中间盘,再将最下面的盘子移到目标盘子,再讲中间n-1的小盘子移到目标盘。不断进行递归即可求解。

分治

将问题分为多个规模较小的子问题进行求解在合并。

归并排序

归并排序是分治一个非常经典的利用。
大致代码:

void sort(int l,int r)
{
if(l==r)return;
int mid=(l+r)/2;
sort(1,mid);
sort(mid+1,r);
int tl=l;tr=mid+1;//指针
for(i=l to r)
if(tl>mid||(tr<=r&&a[tr]<=a[tl]))
b[i]=a[tr++];
else
b[i]=a[tl++];
}

典型例题

(1)给定2^n,2^n的棋盘,其中有一个坏点
你需要用若干个L型方块覆盖棋盘:不能覆盖刀坏点,其他点要被覆盖恰好一次。
将棋盘分为4份求解。(把正中间的L视为3个坏点,真正坏点所在的那一份不能用中间的坏点覆盖)
(2)给定一个序列,判断它是否是优美的。(优美:任取一个子区间,其中有至少一个只出现一次的数)
o(n^2)的方法
定义solve(l,r)
在[L,R]中找一个独一无二的数,位置为X,则
》任意跨越X的区间都符合题意
》》 递归solve(1,x-1)和solve(x,r)。
优化:从中间搜

二分

通过二分把最优化问题转化为判定性问题。

经典例题

NOIP2015跳石子。
主要思路为二分答案算出该答案所需移的石头。

倍增

当模拟某个过程一步步太慢,把模拟的步数二进制分解,优化复杂度。

经典例题

1)LCA(树最近公共祖先)
朴素思路:先使两个点跳到同一高度,在一步步往上跳。
倍增优化:将father[n]变为father[n][i](将n向上跳2^i步的祖先)
预处理:father[x][i+1]=fa[fa[x][i]][i]
调整深度的优化:

t=abs(deep[x]-deep[y])
for(i=lognmax to 1)
    if(t & (1<<i))//如果需要跳
      x=fa[x][i];  //跳                       

注意特判一个是另一个的祖先。
2)给定一个整数序列,多次询问一段区间中的最小值。
(线段树也可以 规避线段树)
预处理chart[x][i]表示区间[x,x+2^i)内的最小值。
chart[x][i+1]=min(chart[x][i],chart[x+2^i][i])
一次询问可以拆成两个长度为2^i的区间的并。
这种算法叫做稀疏表(sparse table)(st表)
3)一个长度为n的序列,序列中的数都是[0,25]内的整数
每次你可以选择序列中两个相邻的、同为x的数,把它们擦掉并在原位置写上x+1。 问可以得到的最大的数是多少。
、 首先最大的数一定是logn+25左右
、 其次对于任意一个左端点 l 和一个数v,如果存在【l,r】使得【l,r】能合并成v,这样的r是唯一的。

贪心

局部最优解合并为全局最优解

经典例题

(1)国王游戏
按照a*b排序从小到大即可
(2)给定一张 n 个点、m 条边的图,每个点和每条边有一个分数
Alice 和 Bob 轮流给图上的点染色,Alice 染红色,Bob 染蓝色,直到所有点都被染上色。
Alice 的分数为所有红点分数之和,加上两端点均为红色的边的分数之和;Bob 类似
双方都绝顶聪明,问最后 Alice 分数 - Bob 分数的值?
这道题的思路比较简单,如果一条边的两个点都被一个人染了,那么这个人就可以获得该条边的分值,如果分别被两个人染则谁都没有分。那么我们不妨将一条边的分数平摊到两个端点,两个人依次挑最大分值点即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值