Unverified Commit 9433dba6 authored by ir1d's avatar ir1d Committed by GitHub
Browse files

Merge pull request #1165 from TrisolarisHD/master

add (inverse) trigonometric functions on polynomial
parents 1c4b237d 4a5fc1f1
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@

递归代码最重要的两个特征:结束条件和自我调用。自我调用是在解决子问题,而结束条件定义了最简子问题的答案。

```c++
```cpp
int func(传入数值) {
  if (终止条件) return 最小子问题解;
  return func(缩小规模);
@@ -215,5 +215,3 @@ void merge_sort(一个数组) {
好了,这个算法也就这样了,完全没有任何难度。记住之前说的,相信函数的能力,传给他半个数组,那么这半个数组就已经被排好了。而且你会发现这不就是个二叉树遍历模板吗?为什么是后序遍历?因为我们分治算法的套路是 **分解 -> 解决(触底) -> 合并(回溯)** 啊,先左右分解,再处理合并,回溯就是在退栈,就相当于后序遍历了。至于`merge`函数,参考两个有序链表的合并,简直一模一样。

LeetCode 上有分治算法的专项练习,[点这里去做题](https://leetcode.com/tag/divide-and-conquer/)

+3 −3
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@

枚举两个数的代码很容易就可以写出来。

```c++
```cpp
for (int i = 0; i < n; ++i)
  for (int j = 0; j < n; ++j)
    if (a[i] + a[j] == 0) ++ans;
@@ -37,7 +37,7 @@ for (int i = 0; i < n; ++i)

我们不妨要求第一个数要出现在靠前的位置。代码如下:

```c++
```cpp
for (int i = 0; i < n; ++i)
  for (int j = 0; j < i; ++j)
    if (a[i] + a[j] == 0) ++ans;
@@ -49,7 +49,7 @@ for (int i = 0; i < n; ++i)

两个数是否都一定要枚举出来呢?这里我们发现枚举其中一个数之后,题目的条件已经帮我们确定了其他的要素(另一个数),如果能找到一种方法直接判断题目要求的那个数是否存在,就可以省掉枚举后一个数的时间了。

```c++
```cpp
// 要求 a 数组中的数的绝对值都小于 MAXN
bool met[MAXN * 2];
// 初始化 met 数组为 0;
+2 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ DAG 即[有向无环图](/graph/dag),一些实际问题中的二元关系都

### 题解

```c++
```cpp
#include <cstring>
#include <iostream>
#define MAXN (30 + 5)
+15 −15
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@

因为是连续的,所以只要与上一个元素进行比较即可。

```c++
```cpp
int a[MAXN];
int dp() {
  int now = 0, ans = 1;
@@ -116,7 +116,7 @@ int dp() {

 $O\left(n^2\right)$ 的算法。每一次重头扫描找出最佳答案。

```c++
```cpp
int a[MAXN], d[MAXN];
int dp() {
  d[1] = 1;
+1 −1
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ $$

在这种情况下,我们定义过程 $\textsf{DP}(l, r, k_l, k_r)$ 表示求解 $f_{l}\sim f_{r}$ 的状态值,并且已知这些状态的最优决策点必定位于 $[k_l, k_r]$ 中,然后使用分治算法如下:

```C++
```cpp
void DP(int l, int r, int k_l, int k_r) {
	int mid = (l + r) / 2, k = k_l;
	// 求状态f[mid]的最优决策点
Loading