枚举形式 | 数据范围 | 遍历方式 |
多项式 |
n^k | for 递推 |
指数 | k^n | 递归 位运算 |
排列 | n! | 递归 |
组合 | C(m,n) | 递归+剪枝 |
前缀和
用O(1)的时间查询静态区间的sum(l,r)
或sum((l1,l2),(r1,r2))的矩阵和
一维 | sum[i]=sum[i-1]+a[i] | sum(l,r)=sum[r]-sum[l-1] |
二维 |
sum[i][j]= sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i] |
sum((l1,l2),(r1,r2))= sum[r1][r2]-sum[r1][l2]-sum[r2][l1]+sum[l1][l2] |
递归
注意如下
1.如何缩小子问题
2.子问题对现在的影响
3.边界
4.还原到上一层
全排列
void dfs(int sum)
{
for(int i=1;i<=n;i++)
{
if(!pd[i])
{
a[sum]=i;//子问题的影响
pd[i]=1;
if(sum==n) print(sum);//边界
else dfs(sum+1);
pd[i]=0;//还原现场
}
}
}
dfs(1);
希望考场不要写挂